一、变量基础:$var与${var}的区别
$var:简单变量引用,适用于变量名无歧义的场景。${var}:明确界定变量名范围,避免与后续字符混淆。<br />例如:
bash
BashA="test" echo "${A}BBB" # 输出 testBBB echo "$A BBB" # 输出 test BBB(无需花括号)
二、字符串处理:删除匹配模式
1. 操作符 # 和 %
#:从左向右删除匹配项。%:从右向左删除匹配项。- 单符号:最小匹配(删除最短匹配)。
- 双符号:最大匹配(删除最长匹配)。
示例:文件路径处理
bash
Bashfile="/dir1/dir2/dir3/my.file.txt"
| 命令 | 解释 | 结果 |
|---|---|---|
${file#*/} | 删除第一个/及其左侧 | dir1/dir2/dir3/my.file.txt |
${file##*/} | 删除最后一个/及其左侧 | my.file.txt |
${file#*.} | 删除第一个.及其左侧 | file.txt |
${file##*.} | 删除最后一个.及其左侧 | txt |
${file%/*} | 删除最后一个/及其右侧 | /dir1/dir2/dir3 |
${file%%/*} | 删除第一个/及其右侧 | (空值) |
${file%.*} | 删除最后一个.及其右侧 | /dir1/dir2/dir3/my.file |
${file%%.*} | 删除第一个.及其右侧 | /dir1/dir2/dir3/my |
记忆技巧
#像键盘上的“左”键(靠近$左侧),处理左侧字符。%像键盘上的“右”键(靠近$右侧),处理右侧字符。*是通配符,表示匹配任意字符。
三、子串截取与替换
1. 截取子串
bash
Bash${变量:起点:长度}
-
示例:
bash
Bash${file:0:5} # 提取前5个字符:/dir1 ${file:5:5} # 从第5字符开始取5个:/dir2
2. 替换内容
bash
Bash${变量/旧模式/新模式} # 替换第一个匹配项 ${变量//旧模式/新模式} # 替换所有匹配项
-
示例:
bash
Bash${file/dir/path} # 替换第一个dir为path → /path1/dir2/dir3/... ${file//dir/path} # 全部替换 → /path1/path2/path3/...
3. 获取变量长度
bash
Bash${#变量} # 返回字符串的字符数
- 示例:
${#file}→ 27。
四、条件赋值:处理变量未定义或空值
1. 语法规则
| 表达式 | 说明 |
|---|---|
${var-default} | 若 var 未定义,返回 default,否则返回 var。 |
${var:-default} | 若 var 未定义或为空,返回 default,否则返回 var。 |
${var+alternate} | 若 var 已定义(包括空值),返回 alternate,否则返回空。 |
${var:+alternate} | 若 var 为非空值,返回 alternate,否则返回空。 |
${var=default} | 若 var 未定义,将其赋值为 default 并返回。 |
${var:=default} | 若 var 未定义或为空,将其赋值为 default 并返回。 |
${var?error_msg} | 若 var 未定义,打印 error_msg 并终止脚本。 |
${var:?error_msg} | 若 var 未定义或为空,打印 error_msg 并终止脚本。 |
2. 示例解析
bash
Bash# 假设 var 未定义 echo ${var-"未定义"} # 输出 "未定义" echo ${var:-"空或未定义"} # 输出 "空或未定义" var="" echo ${var+"已定义"} # 输出 "已定义"(var存在,即使为空) echo ${var:+"非空"} # 无输出(var为空) var="value" echo ${var:?"存在"} # 输出 "value"
五、关键注意事项
- 冒号
:的作用<br />带冒号的表达式(如:-)会同时检查变量是否为空值,不带冒号的仅处理未定义状态。 - 赋值与返回值<br />
=和:=不仅返回值,还会修改变量的值,适合初始化变量。 - 错误处理<br />
?和:?用于强制校验变量,避免脚本因缺失关键参数而异常运行。
六、总结
通过灵活使用 ${} 操作符,可以轻松实现字符串裁剪、替换、条件赋值等高阶操作。核心记忆点:
#和%控制删除方向。:决定是否处理空值。- 双符号(
##、%%)启用最大匹配。
掌握这些技巧后,Shell脚本的字符串处理将变得高效且优雅。建议结合实践场景多加练习,以深化理解。
