Shell参数扩展语法解析
在Shell脚本中,${prop_file%/*}
是一种 参数扩展(Parameter Expansion) 语法,用于从字符串的 末尾(右侧) 删除匹配指定模式的最短部分。具体作用如下:
${prop_file%/*}
的含义:
%
:表示从字符串的 末尾(右侧) 开始删除。/*
:匹配的模式,表示 一个斜杠/
及其后面的任意字符(*
是通配符)。- 效果:删除变量
prop_file
值中 最后一个/
及其右侧的所有内容(相当于获取文件路径的目录部分)。
示例解析:
假设 prop_file
的原始值为:
prop_file="vendor/bes/boards/best1700_ep/p62lte/src/etc/build.prop"
执行 ${prop_file%/*}
后:
echo "${prop_file%/*}"
# 输出:vendor/bes/boards/best1700_ep/p62lte/src/etc
- 删除了末尾的
/build.prop
(最后一个/
及其右侧内容)。 - 结果是原文件路径的 目录路径。
在您代码中的用途:
[[ "$device" == "p62lte" ]] && prop_file="${prop_file%/*}/build_lte.prop"
- 条件判断:如果
device
的值为"p62lte"
,则执行右侧操作。 - 操作逻辑:
${prop_file%/*}
:获取原路径的目录部分(例如vendor/bes/boards/best1700_ep/p62lte/src/etc
)。- 拼接新文件名:
${prop_file%/*}/build_lte.prop
→ 生成新路径vendor/bes/boards/best1700_ep/p62lte/src/etc/build_lte.prop
。
- 目的:将原路径中的文件名
build.prop
替换为build_lte.prop
,保持目录结构不变。
类似语法对比:
语法 | 方向 | 匹配模式 | 效果 |
---|---|---|---|
${var%pattern} | 从末尾 | 最短匹配 | 删除末尾匹配的最短部分 |
${var%%pattern} | 从末尾 | 最长匹配 | 删除末尾匹配的最长部分 |
${var#pattern} | 从开头 | 最短匹配 | 删除开头匹配的最短部分 |
${var##pattern} | 从开头 | 最长匹配 | 删除开头匹配的最长部分 |
例如:
path="/home/user/file.txt"
echo ${path%/*} # 输出: /home/user (删除末尾最短匹配 `/*`)
echo ${path%%/*} # 输出: (空,删除末尾最长匹配 `/*` → 全部内容)
echo ${path#*/} # 输出: home/user/file.txt (删除开头最短匹配 `*/`)
echo ${path##*/} # 输出: file.txt (删除开头最长匹配 `*/` → 目录部分)
总结:
${prop_file%/*}
用于提取文件路径的 目录部分(去掉最后一个/
后的文件名)。- 在您的代码中,它实现了 动态修改文件路径,将文件名从
build.prop
替换为build_lte.prop
,同时保留原目录结构。