shell字符串操作含截取、拼接、默认值替换三类:截取为只读操作,支持位置和模式匹配;拼接直接连写,注意引号规则;默认值替换可防空/未定义,提升脚本健壮性。

字符串截取:精准定位,不改原值
Shell 中的字符串截取是只读操作,原始变量内容不会变化,适合做临时提取或判断。
- 按位置取子串:
${var:起始位置:长度},编号从 0 开始。省略长度表示取到末尾,负长度表示从右往左数(如${var:0:-3}去掉末尾 3 个字符) - 按模式掐头:
${var#pattern}删除最左端最短匹配,${var##pattern}删除最左端最长匹配。例如path="/home/user/file.txt",${path##*/}得到file.txt - 按模式去尾:
${var%pattern}删除最右端最短匹配,${var%%pattern}删除最右端最长匹配。例如${path%.*}可去掉扩展名,得/home/user/file
字符串拼接:灵活组合,无需额外命令
拼接在 Shell 中非常直接,把变量和字面量连写即可,注意引号使用规则。
- 双引号内变量自动展开:
full="${dir}/${name}.log",支持空格和特殊字符 - 单引号内不解析变量:
'${dir}/${name}'输出的就是字面字符串 - 无引号时需确保变量不含空格或通配符,否则可能被误拆或展开
- 拼接路径推荐用
dirname和basename配合,更健壮:base=$(basename "$file")、dir=$(dirname "$file")
默认值替换:防空防未定义,提升脚本鲁棒性
变量可能为空或未定义,直接引用易出错。用 ${} 扩展语法可安全兜底。
-
${var:-default}:变量未设置或为空时返回 default,不改变 var -
${var:=default}:同上,但还会把 default 赋给 var,适合初始化 -
${var:?err_msg}:变量为空时报错退出,适合强制参数校验 -
${var:+alt}:变量非空时返回 alt,否则返回空,适合条件开关
实战小技巧:批量改名与路径处理
把截取和默认值结合,能写出简洁实用的逻辑。
- 批量将
.txt改为.bak:for f in *.txt; do mv "$f" "${f%.txt}.bak"; done - 安全获取文件名(兼容空变量):
fname=${1:-$(basename "$0")} - 构造带时间戳的日志路径:
log="${LOG_DIR:-/tmp}/app_$(date +%Y%m%d_%H%M%S).log" - 避免路径末尾多余斜杠:
clean_path=${path%/},多次执行也安全











