常用类型参数替换
${parameter} 与$parameter相同, 也就是变量parameter的值.
在某些上下文中, ${parameter}很少会产生混淆.
${parameter-default} 如果变量parameter没被声明, 那么就使用默认值.
${parameter:-default} 如果变量parameter没被设置, 那么就使用默认值.
${parameter-default}和${parameter:-default}在绝大多数的情况下都是相同的.
只有在parameter已经被声明, 但是被赋null值得时候, 这个额外的:才会产生不同
的结果(即此时前者不会输出,后者可以输出).
${parameter=default} 如果变量parameter没声明, 那么就把它的值设为default.
${parameter:=default} 如果变量parameter没设置, 那么就把它的值设为default.
这两种形式基本上是一样的. 只有在变量$parameter被声明并且被设置为null值的时候, :才会引
起这两种形式的不同.(如上边所示)
${parameter+alt_value} 如果变量parameter被声明了, 那么就使用alt_value, 否则就使用
null字符串.
${parameter:+alt_value} 如果变量parameter被设置了, 那么就使用alt_value, 否则就使用
null字符串.
这两种形式绝大多数情况下都一样. 只有在parameter被声明并且设置为null值的时候, 多出来的
这个:才会引起这两种形式的不同(即后者不会输出).
${parameter?err_msg} 如果parameter已经被声明, 那么就使用设置的值, 否则打印err_msg
错误消息.
${parameter:?err_msg} 如果parameter已经被设置, 那么就使用设置的值, 否则打印
err_msg错误消息.
这两种形式绝大多数情况都是一样的. 和上边所讲的情况一样, 只有在parameter被声明并设置为
null值的时候, 多出来的:才会引起这两种形式的不同.
变量长度/子串删除
${#var}
字符串长度(变量$var得字符个数). 对于array来说, ${#array}表示的是数组中第一个元素的长度.
例外情况:
${#*}和${#@}表示位置参数的个数.
对于数组来说, ${#array[*]}和${#array[@]}表示数组中元素的个数.
${var#Pattern}, ${var##Pattern}
从变量$var的开头删除最短或最长匹配$Pattern的子串.
${var%Pattern}, ${var%%Pattern}
从变量$var的结尾删除最短或最长匹配$Pattern的子串.
变量扩展/子串替换
这些结构都是从ksh中引入的.
${var:pos}
变量var从位置pos开始扩展(即pos之前的字符都丢弃).
${var:pos:len}
变量var从位置pos开始, 并扩展len个字符.
${var/Pattern/Replacement}
使用Replacement来替换变量var中第一个匹配Pattern的字符串.
${var//Pattern/Replacement}
全局替换. 所有在变量var匹配Pattern的字符串, 都会被替换为Replacement.
${!varprefix*}, ${!varprefix@}
匹配所有之前声明过的, 并且以varprefix开头的变量.