参数替换
1.处理和(或)扩展变量
${parameter}与$parameter相同, 也就是变量parameter的值. 可以把变量和字符串组合起来使用.
PATH=${PATH}:/opt/bin #在脚本的生命周期中, /opt/bin会被添加到$PATH变量中.
1.1${parameter-default}, ${parameter:-default}
${parameter-default} -- 如果变量parameter没被声明, 那么就使用默认值.
${parameter:-default} -- 如果变量parameter没被设置, 那么就使用默认值.
${parameter-default} 和${parameter:-default}在绝大多数的情况下都是相同的.
只有在parameter已经被声明, 但是被赋null值得时候, 这个额外的:才会产生不同的结果.
1.2${parameter=default}, ${parameter:=default}
${parameter=default} -- 如果变量parameter没声明, 那么就把它的值设为default.
${parameter:=default} -- 如果变量parameter没设置, 那么就把它的值设为default.
只有在变量$parameter被声明并且被设置为null值的时候, :才会引起这两种形式的不同.
1.3${parameter+alt_value}, ${parameter:+alt_value}
${parameter+alt_value} -- 如果变量parameter被声明了, 那么就使用alt_value, 否则就使用null字符串.
${parameter:+alt_value} -- 如果变量parameter被设置了, 那么就使用alt_value, 否则就使用null字符串.
只有在parameter被声明并且设置为null值的时候, 多出来的这个:才会引起这两种形式的不同,
1.4${parameter?err_msg}, ${parameter:?err_msg}
${parameter?err_msg} -- 如果parameter已经被声明, 那么就使用设置的值, 否则打印err_msg错误消息.
${parameter:?err_msg} -- 如果parameter已经被设置, 那么就使用设置的值, 否则打印err_msg错误消息.
只有在parameter被声明并设置为null值的时候, 多出来的:才会引起这两种形式的不同.
2.变量长度/子串删除
2.1${#var}字符串长度(变量$var得字符个数).
对于array来说, ${#array}表示的是数组中第一个元素的长度.
例外情况:
${#*}和${#@}表示位置参数的个数.
对于数组来说, ${#array[*]}和${#array[@]}表示数组中元素的个数.
2.2${var#Pattern}, ${var##Pattern}
从变量$var的开头删除最短或最长匹配$Pattern的子串.
这是一个很常见的用法, 请读者牢记, 一个"#"表示匹配最短, "##"表示匹配最长.
2.3${var%Pattern}, ${var%%Pattern}
从变量$var的结尾删除最短或最长匹配$Pattern的子串.
这是一个很常见的用法, 请读者牢记, 一个"%"表示匹配最短, "%%"表示匹配最长
3.变量扩展/子串替换
3.1${var:pos} 变量var从位置pos开始扩展(译者注: 也就是pos之前的字符都丢弃).
3.2 ${var:pos:len}变量var从位置pos开始, 并扩展len个字符.
3.3 ${var/Pattern/Replacement}
使用Replacement来替换变量var中第一个匹配Pattern的字符串. 如果省略Replacement, 那么第一个匹配Pattern的字符串将被替换为空, 也就是被删除了.
3.4 ${var//Pattern/Replacement}
全局替换. 所有在变量var匹配Pattern的字符串, 都会被替换为Replacement. 和上边一样, 如果省略Replacement, 那么所有匹配Pattern的字符串, 都将被替换为空, 也就是被删除掉.
3.5 ${var/#Pattern/Replacement}
如果变量var的前缀匹配Pattern, 那么就使用Replacement来替换匹配到Pattern的字符串.
3.6 ${var/%Pattern/Replacement}
如果变量var的后缀匹配Pattern, 那么就使用Replacement来替换匹配到Pattern的字符串.
3.7 ${!varprefix*}, ${!varprefix@}
匹配所有之前声明过的, 并且以varprefix开头的变量.
注意事项
[1] 如果在一个非交互脚本中, $parameter被设置为null的话, 那么这个脚本将会返回127作为退出状态码(127返回码对应的Bash错误码为命令未发现"command not found").
阅读(547) | 评论(0) | 转发(0) |