shell中的参数替换

常用类型参数替换

${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开头的变量.

猜你喜欢

转载自q928856957.iteye.com/blog/2245798