bash参考手册之三(基本的Shell特性)续六
3.5.3 shell参数扩展
如果parameter没有被设置,或者是空,结果为word的扩展。否则,结果为parameter的值。${parameter:=word}
如果parameter没有被设置,或者是空,word的扩展被赋值给parameter。然后,结果为parameter的值。位置参数和特殊参数不能以这种方式赋值。${parameter:?word}
如果parameter没有被设置,或者是空,word的扩展(或如果word不存在,会发出消息)被写入到标准错误和shell,如果不是交互的就退出。否则,结果是parameter的值。${parameter:+word}
如果parameter没有被设置,或者是空,结果是空白(nothing),否则是word的扩展。${parameter:offset}
扩展parameter中,从offset设定的开始的length那么长的字符。如果省略length,扩展为从offset设定的开始位置的parameter的子串。length和offset是算术表达式(见shell算术)。这被称为的子字符串扩展。
如果offset的计算结果为小于零的数字,该值被设置为从parameter的值的尾部开始的偏移量。如果length的计算结果为小于零的数,并且parameter不是“@”,也不是索引或关联数组,它被解释为从parameter的值的尾部开始的偏移量,而不是一个字符的号码,扩展结果是两个偏移量之间的字符。如果parameter是'@',结果是从offset开始的length个位置参数。如果parameter是一个索引数组下标以'@'或'*'为名称,其结果是从${parameter[offset]}开始的length长度的数组元素。负的offset是指定数组的最大索引+1。对关联数组作子字符串扩展,会产生不可预料的结果。
注意,负的offset必须至少和冒号隔开一个空格,以避免和':-'扩展混淆。子字符串的索引是从零开始的,位置参数除外,使用位置参数时,默认索引从1开始。如果offset为0,并且使用了位置参数,$@为列表的前缀。${!prefix*}
扩展为名称以prefix开头的变量名,使用特殊变量IFS的第一个字符来分隔名称。当使用'@',并且扩展被双引号包含时,每个变量名扩展为一个单独的单词。${!name[@]}
如果name是一个数组变量,扩展为name中的索引(键)列表。如果name不是数组,当name已经被设置的话,扩展为0,否则返回null。如果使用'@',并且被双引号包含,则每个键被扩展为一个单独的词。${#parameter}
获得扩展后的parameter的字符的长度。如果parameter是'*'或'@',获得的值是位置参数的个数。如果parameter是数组名,并且使用下标“*”或“@”,获得的值是数组中元素的数量。${parameter#word}
word被扩展,产生一个类似文件名扩展的模式(见文件名扩展)。如果这个模式匹配parameter扩展结果的开头,那么这个表达式的结果就是parameter扩展的结果,并删除掉其中最短的匹配模式('#'的情况下)的那部分,或最长匹配的模式('##'的情况下)的那部分。如果parameter是'@'或'*',则模式的删除操作被依次施加到每个位置参数,获得的是结果列表。如果参数是数组变量,并带有下标'@'或'*',模式的删除应用到数组中的每个成员,获得的是结果列表。${parameter%word}
word被扩展,产生一个类似文件名扩展的模式(见文件名扩展)。如果这个模式匹配parameter扩展结果的结尾部分,那么这个表达式的结果就是parameter扩展的结果,并删除掉其中最短的匹配模式('#'的情况下)的那部分,或最长匹配的模式('##'的情况下)的那部分。如果parameter是'@'或'*',则模式的删除操作被依次施加到每个位置参数,获得的是结果列表。如果参数是数组变量,并带有下标'@'或'*',模式的删除应用到数组中的每个成员,获得的是结果列表。${parameter/pattern/string}
pattern被扩展,产生一个类似文件名扩展的模式。pamameter被扩展,并且其中最长的匹配pattern的字符串被string替换。如果pattern以'/'开始,所有匹配pattern的字符串被替换。通常情况下,只有第一个匹配被替换。如果pattern以'#'开始,它必须匹配扩展后的parameter的开头。如果pattern以'%'开始,它必须匹配扩展后的parameter的尾部。如果string是null,匹配pattern的部分被删除,pattern后面的/被忽略。如果parameter是'@'或'*',替换操作被依次施加到每个位置参数,获得的是结果列表。如果parameter是数组变量,且下标为'@'或'*',替换操作被依次施加到数组中的每个成员,获得的是结果列表。${parameter^pattern}
这种扩展修改parameter中的英文字母的大小写。pattern被扩展,产生一个类似文件名扩展的模式。 “^”操作符把匹配pattern的小写字母转换为大写;“,”操作符将匹配pattern的大写字母转换为小写。 '^^'和',,'扩展,在扩展后的值中转换每一个匹配的字符,'^'和','扩展,仅在扩展后的值中转换第一个字符。如果pattern被省略,它被视为'?'——匹配每一个字符。如果parameter是'@'或'*',修改操作被依次施加到每个位置参数,获得的是结果列表。如果parameter是数组变量,且下标是'@'或'*',修改操作被依次施加到数组中的每一个成员,获得的是结果列表。
原文链接:http://www.gnu.org/software/bash/manual/bash.html#Shell-Parameter-Expansion