您的位置:首页 > 运维架构 > Shell

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

2013-01-29 16:55 344 查看
3.5.4 命令替换

命令替换允许一个命令的输出来替换这个​​命令本身。命令替换发生在如下情形:

$(command)




`command`


Bash通过执行command,把命令替换为该命令的标准输出,来进行扩展,同时需要删除尾部的换行。内嵌的换行符不会被删除,但在可能会在单词分割时移除。$(cat file)可以换成等价的,但速度更快的$(< file)。

当使用旧式的反引号替换形式时,反斜杠保留它的字面意思,但在后面跟着'$','`',或'\'时除外。第一个前面没有反斜杠的反引号终止命令替换。当使用$(command)的形式时,在括号之间的所有字符被当做命令,没有特殊处理。

命令替换可以嵌套。使用反引号形式时,嵌套内部的反引号要用反斜杠转义。

如果替换出现在双引号中,在结果上不执行单词分割和文件名扩展。

3.5.5 算术扩展

算术扩展允许计算一个算术表达式并替换为结果。算术扩展的格式是:

$(( expression ))

表达式被视为是在双引号内,但括号内的双引号是不会特殊处理的。在表达式中的所有标记进行参数扩展,命令替换和引号移除。算术扩展可以嵌套。
根据下面列出(参阅Shell算术)的规则进行计算。如果表达式是无效的,bash打印指出问题的消息到标准错误,并且不做替换。

3.5.6 进程替换

进程替换仅仅在支持命名管道(FIFO)或/dev/fd来命名打开的文件的系统上可用。它采取的形式是:

<(list)



>(list)

进程list运行时,输入或输出连接到FIFO或在/dev/fd中的文件。作为扩展的结果,把此文件名作为参数传递到当前命令。如果使用>(list)的形式,对该文件的写入,将为list提供输入。如果使用<(list)形式时,作为参数传递的文件应被读取,以获得list的输出。需要注意的<或>和左括号之间是没有空格的,否则将被解释为重定向。
当进程替换可用时,进程替换和参数变量扩展,命令替换和算术扩展,同时进行。

3.5.7 单词分割

shell扫描参数扩展,命令替换和算术扩展的结果,对于没有被双引号包含的内容进行单词分割。
shell将$IFS的每个字符作为分隔符,按照这些字符分割其他扩展的结果。如果$IFS未设置,或者它的值正好是<space><tab><newline>这样的缺省值,那么<space>,<tab>,<newline>的序列,出现在其他扩展的结果的开始和结束位置时,将被忽略,而没有出现在开头或结尾的任何IFS字符的序列起到分隔的作用。如果IFS的值不是缺省值,那么,只要空白字符在IFS(IFS空白字符)的值中出现,单词开头和结尾的空白字符(space和tab)就被忽略。在IFS字符中不是IFS空白字符的那些字符,随着任何相邻的IFS空白字符起到分隔字段的作用。IFS空白字符的序列也被视为一个分隔符。如果IFS的值是null,则不会发生单词分割。

显式的空值参数(""或者'')将被保留。不带引号的隐式空值参数,从参数扩展来的没有值的结果,将被删除。如果一个没有值的参数在双引号中扩展,则产生一个空值参数,并被保留下来。

请注意,如果没有发生扩展,则不进行单词分割。

3.5.8 文件名扩展

•模式匹配:shell如何匹配模式。

在单词分割之后,除非-f选项已被设置(参见内建命令set),Bash将扫描每个单词中的字符'*','?',和'['。如果这些字符中的任一个出现,那么这个单词被视为一个模式,并且被替换成和模式相匹配的按字母顺序排序的文件名列表。如果没有匹配的文件名,并且shell选项nullglob被禁用,单词保持不变。 如果nullglob选项被设置,并且没有找到任何匹配,这个单词被删除。如果设置了shell选项failglob,并且没有找到任何匹配,则显示错误消息,而且不执行该命令。
如果启用了shell选项nocaseglob,匹配时不考虑字母大小写。

当一个模式用于文件名扩展时,字符'.'位于文件名开始位置,或紧随一个斜线时,必须明确地匹配,除非shell的选项dotglob被设置。当匹配文件名时,斜线字符必须总是明确地匹配。其他情况下,'.'字符不作特殊处理。

请参阅内建命令shopt命令中shopt的描述,以查看nocaseglob,nullglob,failglob,和dotglob选项的说明。
shell变量GLOBIGNORE可用于限制匹配模式的文件名集合。如果设置了GLOBIGNORE,每个匹配的文件名,也符合GLOBIGNORE中的一个模式的文件名将从匹配列表中删除。GLOBIGNORE被设置且不是空时,文件名.和..总是被忽略。然而,设置GLOBIGNORE为一个非空值,也起到启用shell选项dotglob的效果,这样所有以'.'开头的其他的文件名也将匹配。要获得原来的行为——忽略以'.'开头的文件名,则需要在GLOBIGNORE中设置一个'.*'的模式。
GLOBIGNORE被取消设置时,dotglob选项被禁用。

3.5.8.1 模式匹配

除了下面描述的特殊模式字符以外的,任何出现在模式中的字符,匹配其本身。NUL字符不会出现在模式中。反斜杠转义以下的字符,匹配时反斜线自身被丢弃。如果特殊模式字符要匹配字面上的含义时,必须用引号包起来。

特殊模式字符有以下含义:

*

匹配任何字符串,包括空字符串。当shell启用了选项globstar,并在文件名扩展上下文中使用“*”时,相邻的两个“*”用来作为一个单一的模式,以匹配所有文件和零个或多个目录和子目录。如果跟在'/'后面,两个相邻的'*'将只匹配目录和子目录。



匹配任意单个字符。

[…]

匹配包围的字符中的任何一个。一对由连字符隔开的字符表示一个(range expression)范围表达式;任何排序在这两个字符之间的字符,包含边界上的字符被匹配——使用当前区域设置的排序序列和字符集。如果'['之后的第一个字符是一个'!'或一个'^',那么未包括在范围表达式中的任何字符被匹配。 '-'可以被匹配的情况是,把它作为集合的第一个或最后一个字符时。 ']'可以被匹配的情况是,它是集合中的第一个字符。范围表达式中的字符的排序顺序是由目前的区域设置和shell变量LC_COLLATE
的值(假如已被设置)决定的。

例如,在默认的C区域设置环境下,'[a-dx-z]'相当于'[abcdxyz]'。许多区域设置场合,字符按字典顺序排序,在这些场合中,'[a-dx-z]'通常不等于'[abcdxyz]',它可能是相当于'[aBbCcDdxXyYz]'。在方括号表达式中,为了获得的传统上的范围结果,你可以强制使用C区域设置,设置LC_COLLATE或LC_ALL环境变量的值为'C'。

在‘[’和‘]’中,可以使用语法[:class:]指定(character class)字符类,其中class是在POSIX标准中定义的下列类之一:

alnum   alpha   ascii   blank   cntrl   digit   graph   lower

print   punct   space   upper   word    xdigit

一个字符类匹配属于该类的任何字符。word字符类匹配字母,数字和'_'。

在'[',']'中,可以使用语法[=c=]指定一个等价类,匹配所有和字符c具有相同权重(由当前区域设置定义)的所有字符。

在'[',']'中,语法[.symbol.]匹配校对符号symbol。

如果使用内建命令shopt启用了shell选项extglob,几个扩展模式匹配被识别。在以下的说明中,pattern-list是由'|'分隔的一个或多个模式组成的列表。可以使用下列子模式中的一个或多个组成复合模式。

?(pattern-list)

匹配零个或一个给定的模式。

*(pattern-list)

匹配零个或多个给定的模式。

+(pattern-list)

匹配一个或多个给定的模式。

@(pattern-list)

匹配一个给定的模式。

!(pattern-list)

不匹配任何一个给定的模式。

3.5.9 引号移除

在前述的扩展之后,所有不是从任何一个上述扩展中产生的不带引号的字符'\',''',和'“'被移除。

原文链接:http://www.gnu.org/software/bash/manual/bash.html#Shell-Parameter-Expansion
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: