shell 编程之参数展开总结

文档里有更详尽的说明。

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、留意特殊符号,比如各种括号的使用方法。

Guess you like

Origin blog.csdn.net/zhouguoqionghai/article/details/102466166