注:详细可参考 man bash 的 Parameter Expansion 和 Pattern Matching


首先,初始化如下变量:

sh
1VAR="aaabbbccc"

常规的引用,可使用花括号,也可以(在不引起歧义的情况下)不使用花括号:

sh
1echo $VAR        # aaabbbccc
2echo ${VAR}      # aaabbbccc
3echo ${VAR}_123  # aaabbbccc_123(必须使用花括号,否则可能被解析为 VAR_123 变量)

缺省值:

sh
 1echo ${VAR2}       # (空值)
 2echo ${VAR2:-xyz}  # xyz(返回该缺省字符串)
 3echo ${VAR2}       # (仍是空值)
 4
 5echo ${VAR2:=xyz}  # xyz(返回该缺省字符串)
 6echo ${VAR2}       # xyz(已被上一条语句赋值
 7
 8echo ${VAR3:?abc}  # -bash: VAR3: abc(此信息输出到stderr,并导致脚本退出)
 9echo ${VAR3:+abc}  # (空值,仅当变量为空时才替换为缺省字符串)
10echo ${VAR2:+abc}  # abc(因 VAR2 此时非空)

切片:

sh
1# 两个数字,分别表示起始字符(从0计)和长度
2echo ${VAR:3}     # bbbccc
3echo ${VAR:0:3}   # aaa
4echo ${VAR:3:4}   # bbbc
5echo ${VAR:5:3}   # bcc
6echo ${VAR:3:-1}  # bbbcc(至末尾倒数第1个字符结束,不包括该字符)
7echo ${VAR:3:-2}  # bbbc(至末尾倒数第2个字符结束,不包括该字符)

字符长度:

sh
1echo ${#VAR}  # 9

去掉前缀:

sh
1echo ${VAR#a}  # aabbbccc  # 去掉前缀(一个字符)
2echo ${VAR%c}  # aaabbbcc  # 去掉后缀(一个字符)
3
4echo ${VAR##+(a)}  # bbbccc  # 去掉前缀(一个或多个字符,##表示尽可能匹配最长)
5echo ${VAR%%+(c)}  # aaabbb  # 去掉后缀(一个或多个字符,%%表示尽可能匹配最长)

替换:

sh
1echo ${VAR/b/x}   # aaaxbbccc(替换一次)
2echo ${VAR//b/x}  # aaaxxxccc(替换全部)