文档里有更详尽的说明。
1、shell的执行方式为先展开替换,再执行。
2、shell 的展开的几种情况:路波花,参算命。前3种在双引号中不再展开,后3种在双引号中能展开。单引号中的是字面量,不展开,但是嵌套的双层单引号中全部展开。
参数展开有6种情况:
1.)直接展开:
${var}
2.)删除模式展开:
${var#pattern}
${var##pattern}
# #表示从头开始匹配 ##是贪心法的长模式
${var%pattern}
${var%%pattern}
# %表示匹配结尾
#删除模式还有一种替换模式衍变而来的模式,即替换的部分省略,表示置空
${var/pattern}
${var//pattern} #删除所有匹配的
#此种模式下,依然可以使用#和%%表示开头和结尾
${var/#pattern}
${var/%pattern}
3.)空检测展开:
#为空则展开为value,否则为var. 即最终展开式为var或者value
${var:-value}
#为空则展开为value,否则为var. 并且var被赋值为value
${var:=value}
#不为空则展开为value. 即最终展开式为空或者value
${var:+value}
#不为空则为var,为空则输出value到标准错误
${var:?value}
+--------------------+----------------------+-----------------+-----------------+
| Expression | FOO="world" | FOO="" | unset FOO |
| in script: | (Set and Not Null) | (Set But Null) | (Unset) |
+--------------------+----------------------+-----------------+-----------------+
| ${FOO:-hello} | world | hello | hello |
| ${FOO-hello} | world | "" | hello |
| ${FOO:=hello} | world | FOO=hello | FOO=hello |
| ${FOO=hello} | world | "" | FOO=hello |
| ${FOO:?hello} | world | error, exit | error, exit |
| ${FOO?hello} | world | "" | error, exit |
| ${FOO:+hello} | hello | "" | "" |
| ${FOO+hello} | hello | hello | "" |
+--------------------+----------------------+-----------------+-----------------+
8 种类型 3 种情况,Set But Null 中间这种情况, 带 ":" 时,可以归结到 unset 里;不带 ":" 时,归结到 set but Null 里(:相当于一个否定前缀un)
4.)替换模式展开
4.1)任意位置替换展开
#第一个出现的pattern替换为value
${var/pattern/value}
#所有匹配的pattern替换为value
${var//pattern/value}
4.2.)始终位置替换展开
#开头匹配的pattern替换为value
${var/#pattern/value}
#结尾匹配的pattern替换为value
${var/%pattern/value}
5.)切片模式展开
#起始索引位置和长度
${var:index:length}
6.)全体变量展开
#所有名字匹配的变量的名字成一组
${!pattern@}
#所有名字匹配的变量的名字成一个整体字符串
${!pattern*}
3、留意特殊符号,比如各种括号的使用方法。