首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 系统运维 >

bash参考手册之三(根本的Shell特性)续六

2013-01-27 
bash参考手册之三(基本的Shell特性)续六3.5.3 shell参数扩展“$”字符引入了参数扩展,命令替换,或者算术扩展

bash参考手册之三(基本的Shell特性)续六

3.5.3 shell参数扩展


“$”字符引入了参数扩展,命令替换,或者算术扩展。可以选择把被扩展的参数名或者符号用大括号括起来的方式的,这样可以防止把跟随在变量名后的字符解释为变量名称的一部分。
当使用大括号时,被匹配的右大括号“}”是第一个没有被反斜杠转义,或不是在引号内的字符串,而且不是在一个内嵌的算术扩展,命令替换,或参数扩展中。
参数扩展的基本形式为${parameter}parameter的值是可替换的。当parameter是一位以上的数字的位置参数时,或者parameter后面的字符不能被解释为它的??名称的一部分时,需要使用大括号。
如果parameter的第一个字符是一个感叹号(!),那么将引入一个间接变量。 bash使用组成这个parameter的其余的字符作为变量的名称;然后这个变量被扩展,该值被用在其余的替代上,而不是parmeter本身的值。这被称为间接扩展。这种扩展的例外,是下面描述的的${!prefix}${!name[@]}。感叹号必须紧跟在左大括号后面,以实现间接变量。
在下面的每一种情况下,word是波浪线扩展,参数扩展,命令替换和算术扩展的对象。
在不执行子字符串扩展时,使用下面所描述的形式,bash测试参数是没有设置还是空。仅对于未设置的参数的测试,则可以省略冒号。换句话说,如果有冒号,将测试两个参数的存在性,和值不为空;如果省略冒号,只测试存在性。
${parameter:-word}
    如果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}

    扩展parameter中,从offset设定的开始的length那么长的字符。如果省略length,扩展为从offset设定的开始位置的parameter的子串。lengthoffset是算术表达式(见shell算术)。这被称为的子字符串扩展。
    如果offset的计算结果为小于零的数字,该值被设置为从parameter的值的尾部开始的偏移量。如果length的计算结果为小于零的数,并且parameter不是“@”,也不是索引或关联数组,它被解释为从parameter的值的尾部开始的偏移量,而不是一个字符的号码,扩展结果是两个偏移量之间的字符。如果parameter是'@',结果是从offset开始的length个位置参数。如果parameter是一个索引数组下标以'@'或'*'为名称,其结果是从${parameter[offset]}开始的length长度的数组元素。负的offset是指定数组的最大索引+1。对关联数组作子字符串扩展,会产生不可预料的结果。
     注意,负的offset必须至少和冒号隔开一个空格,以避免和':-'扩展混淆。子字符串的索引是从零开始的,位置参数除外,使用位置参数时,默认索引从1开始。如果offset为0,并且使用了位置参数,$@为列表的前缀。
${!prefix*}
${!prefix@}

    扩展为名称以prefix开头的变量名,使用特殊变量IFS的第一个字符来分隔名称。当使用'@',并且扩展被双引号包含时,每个变量名扩展为一个单独的单词。
${!name[@]}
${!name[*]}

    如果name是一个数组变量,扩展为name中的索引(键)列表。如果name不是数组,当name已经被设置的话,扩展为0,否则返回null。如果使用'@',并且被双引号包含,则每个键被扩展为一个单独的词。
${#parameter}
    获得扩展后的parameter的字符的长度。如果parameter是'*'或'@',获得的值是位置参数的个数。如果parameter是数组名,并且使用下标“*”或“@”,获得的值是数组中元素的数量。
${parameter#word}
${parameter##word}

   word被扩展,产生一个类似文件名扩展的模式(见文件名扩展)。如果这个模式匹配parameter扩展结果的开头,那么这个表达式的结果就是parameter扩展的结果,并删除掉其中最短的匹配模式('#'的情况下)的那部分,或最长匹配的模式('##'的情况下)的那部分。如果parameter是'@'或'*',则模式的删除操作被依次施加到每个位置参数,获得的是结果列表。如果参数是数组变量,并带有下标'@'或'*',模式的删除应用到数组中的每个成员,获得的是结果列表。
${parameter%word}
${parameter%%word}

   word被扩展,产生一个类似文件名扩展的模式(见文件名扩展)。如果这个模式匹配parameter扩展结果的结尾部分,那么这个表达式的结果就是parameter扩展的结果,并删除掉其中最短的匹配模式('#'的情况下)的那部分,或最长匹配的模式('##'的情况下)的那部分。如果parameter是'@'或'*',则模式的删除操作被依次施加到每个位置参数,获得的是结果列表。如果参数是数组变量,并带有下标'@'或'*',模式的删除应用到数组中的每个成员,获得的是结果列表。
${parameter/pattern/string}
   pattern被扩展,产生一个类似文件名扩展的模式。pamameter被扩展,并且其中最长的匹配pattern的字符串被string替换。如果pattern以'/'开始,所有匹配pattern的字符串被替换。通常情况下,只有第一个匹配被替换。如果pattern以'#'开始,它必须匹配扩展后的parameter的开头。如果pattern以'%'开始,它必须匹配扩展后的parameter的尾部。如果stringnull,匹配pattern的部分被删除,pattern后面的/被忽略。如果parameter是'@'或'*',替换操作被依次施加到每个位置参数,获得的是结果列表。如果parameter是数组变量,且下标为'@'或'*',替换操作被依次施加到数组中的每个成员,获得的是结果列表。
${parameter^pattern}
${parameter^^pattern}
${parameter,pattern}
${parameter,,pattern}

    这种扩展修改parameter中的英文字母的大小写。pattern被扩展,产生一个类似文件名扩展的模式。 “^”操作符把匹配pattern的小写字母转换为大写;“,”操作符将匹配pattern的大写字母转换为小写。 '^^'和',,'扩展,在扩展后的值中转换每一个匹配的字符,'^'和','扩展,仅在扩展后的值中转换第一个字符。如果pattern被省略,它被视为'?'——匹配每一个字符。如果parameter是'@'或'*',修改操作被依次施加到每个位置参数,获得的是结果列表。如果parameter是数组变量,且下标是'@'或'*',修改操作被依次施加到数组中的每一个成员,获得的是结果列表。


原文链接:http://www.gnu.org/software/bash/manual/bash.html#Shell-Parameter-Expansion


热点排行