扩张是它已经被分成话后在命令行上执行。有七种扩展:brace expansion,
tilde expansion,
parameter and variable expansion,
command substitution,
arithmetic expansion, word splitting,
pathname expansion.
扩展的顺序是:括号扩展;波浪线扩展,参数和变量扩展,算术扩展和命令替换(在完成左到右的方式);词的拆分;和路径扩展。
在可以支持它的系统,有可用的附加扩展:进程替换.这是在同一时间作为波浪,参数,变量和算术扩展和命令替换进行。
仅括号扩展,分词,和路径扩展可以改变扩张的单词的数目;其他扩展一个字扩展到一个字。唯一的例外是“ @”和“ {name[@]}”的扩展如上所述。
括号扩展
括号扩展是通过其可以产生任意字符串的机制。这个机制类似于路径扩展,但该文件名生成不需要存在。前导前缀包含在大括号中的每个字符串,然后附言被附加到每个结果字符串,扩大左到右。
括号扩展可以嵌套。每个扩展字符串的结果没有排序;左到右的顺序被保留。例如,a{d,c,b}为`ade ace abe’
序列表达的形式为{x..y[..在R]},其中x和y是任一整数或单个字符,incre,可选增量,是整数。当整数被提供,表达式扩展到x和y(含)之间的每个号码。提供的整数可能以0作为前缀,以强制每个术语具有相同的宽度。当X或Y以零开始,shell试图强制所有生成条件包含相同数目的位数,零填充在必要。当角色被提供,表达扩展到字典顺序x和y(含)之间的每个字符,使用默认的C语言环境。注意,x和y必须是同一类型的。当提供的增加,它是用来作为各术语之间的差别。默认增量是1或-1为宜。
括号扩展任何其他扩展之前进行的,特向其他扩展的任何字符在结果保留。这是严格的文本。 Bash没有任何语法解释适用于扩展的上下文或花括号之间的文本。
一个正确形成括号扩展必须包含没有引用的开闭括号,以及至少一个没有引用的逗号或有效序列的表达。任何格式不正确括号扩展将保持不变。为了避免与参数扩展冲突,字符串$ {不被认为是符合括号扩展。
例如:
mkdir /usr/local/src/bash/{old,new,dist,bugs}
or
chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}
括号展开介绍与sh历史稍有不兼容。SH不治疗打开或尤其闭括号时它们显示为一个字的一部分,并保留它们在输出中。bash从文字删除括号括号扩展的后果。例如,一句话进入到SH作为文件{1,2}出现相同的输出。同一个词是由bash的扩展后文件1文件2输出。如果与SH严格的兼容性是理想的,先从+ B选项或禁用括号扩展与+ B选项来设置命令的bash(参见下面的shell内建命令)。
Tilde Expansion(~)
如果一个字与未加引号的波形符(`〜’)开始,所有第一加引号斜线之前的字符被认为是一个波浪线前缀。如果没有在波浪号前缀字符被引用,按照波浪中的波浪线前缀字符被视为一个可能的登录名。如果登录名是空字符串,波浪线将被替换为shell参数HOME的值。如果HOME没有设置,执行的shell用户的主目录,而不是被取代。否则,波浪号前缀被替换为与指定登录名关联的主目录。
如果波浪号前缀是〜+',shell变量PWD的值取代了波浪线前缀。如果波浪号前缀是
〜 - ‘,shell变量OLDPWD的值,如果它被设置,将被替换。
如果登录名是无效的,或者波浪线扩展失败,这个词是不变的。
每个变量赋值检查加引号波浪线前缀紧跟一个:还是先=。在这些情况下,也进行波浪线扩展。因此,可以使用与波浪线的文件名的分配来PATH,MAILPATH,和CDPATH,与shell分配扩大的价值。
**Parameter Expansion(参数扩展)
该`$“字符引入了参数扩展,命令替换,或者算术扩展。参数名称或符号,以扩大可在大括号,它们是可选的,但是用于保护变量从字符扩大紧接它可能被解释为名称的一部分。
Command Substitution(命令替换)
当使用大括号,匹配的结束括号是第一个`}’没有反斜杠或带引号的字符串中逃了出来,而不是一个嵌入的算术扩展中,命令替换,或者参数扩展
Arithmetic Expansion(算术扩展)
参数的值被替换。当参数是与一个以上的位的位置参数括号是必需的,或当参数后跟一个字符这是不被解释为它的名称的一部分。该参数是上面的参数描述一个shell参数)或数组引用(阵列)。
Process Substitution(进程替换)
如果参数的第一个字符是一个感叹号(!),它引入变量间接的水平。bash使用从参数作为变量的名称的其余部分形成的变量的值;然后这个变量被扩展并且该值在替代的其余部分,而不是参数本身的值使用。这被称为间接扩张。这个例外的是的扩展
!prefix∗和
{!name[@]}下面介绍.感叹号必须紧跟在左大括号以引入间接。
${parameter:-word}
使用缺省值。如果参数没有设置或者为空,word的扩展将被替换。否则,参数的值被替换。
${parameter:=word}
指定的默认值。如果参数没有设置或者为空,word的扩展被分配到参数。参数的值,然后被取代。位置参数和特别参数可能不以这种方式被分配到。
${parameter:?word}
显示错误,如果空或取消。如果参数为null或取消,文字的扩大(或一条信息,影响,如果这个词是不存在的)写入标准错误和外壳,如果不是交互式的,退出。否则,参数的值被替换。
${parameter:+word}
使用替代值。如果参数为null或取消,没有被取代,否则单词的扩张将被替换。
${parameter:offset}
${parameter:offset:length}
子字符串扩展。扩展为参数的开始offset指定的字符值可达长度字符。如果参数是@,@由或,或关联数组下标名称索引数组,如下所述的结果不同。子字符串扩展。扩展为参数的开始offset指定的字符值可达长度字符。如果参数是@,@由或,或关联数组下标名称索引数组,如下所述的结果不同。
如果偏移量计算为一个数字小于零,则该值被用作从参数的值的末尾字符的偏移。如果长度计算为一个数字小于零,则将其解释为在字符从参数的值,而不是一个字符数的端部的偏移量,和膨胀是偏移量和该结果之间的字符。
如果参数是@,结果是开始偏移长度的位置参数。负偏移相对于大于最大的位置参数拍摄,所以偏移-1计算到最后一个位置参数。它是一个扩展错误,如果长度计算结果为数字小于零。
如果参数是@或*下标索引数组名,结果以
开头的数组的长度成员参数[偏移]。负的偏移是采取相对比指定数组的最大索引大。它是一个扩展错误,如果长度计算结果为数字小于零。适用于关联数组子扩张产生不确定的结果。子串索引是从零开始的,除非该位置参数的使用,在这种情况下,索引1默认启动。如果偏移量为0,和位置参数被用于,
0被前缀到该列表。
${!prefix*}
${!prefix@}
匹配的名称前缀。扩展为变量名称开头的前缀,由IFS特殊变量的第一个字符分隔的名字。当使用@和扩展出现双引号中,每个变量名扩展为一个词。
${!name[@]}
${!name[*]}
数组的键列表。如果名字是一个数组变量,扩展到在名称分配数组索引(键)列表。如果名称不是一个数组,如果名称设置否则返回null扩展到0。当使用@和扩展出现双引号中,每个按键扩展为一个词。
${#parameter}
参数长度。在参数的值的字符长度被取代的。如果参数是或@,取代的值是位置参数的数目。如果参数是由或@下标数组名,取代的值是数组中元素的数量。如果参数是一个负数下标索引数组名,这个数字被解释为相对于大于参数的最大索引,因此负索引数从数组的末尾后面,-1引用最后的索引 元件。
${parameter#word}
${parameter##word}
删除匹配的前缀模式。 word被扩展为一个模式,就像路径扩展。如果模式参数的值的开头匹配,则该扩张的结果是参数的最短的匹配(#''的情况)或者最长的匹配(
##’展开的值’的情况)删除。如果参数是@或,模式删除操作应用于依次在每个位置参数,最后扩展为结果的列表。如果参数是@或下标数组变量,模式删除操作应用于反过来数组的每个成员,最后扩展为结果的列表。
${parameter#word}
${parameter##word}
删除匹配的前缀模式。word被扩展为一个模式,就像路径扩展。如果模式参数的值的开头匹配,则该扩张的结果是参数的最短的匹配(#''的情况)或者最长的匹配(
##’展开的值’的情况)删除。如果参数是@或,模式删除操作应用于依次在每个位置参数,最后扩展为结果的列表。如果参数是@或下标数组变量,模式删除操作应用于反过来数组的每个成员,最后扩展为结果的列表。
${parameter%word}
${parameter%%word}
删除匹配的后缀模式。 word被扩展为一个模式,就像路径扩展。如果模式参数扩展后的值的尾部相匹配,那么扩张的结果是参数的最短的匹配(%''的情况)或者最长的匹配(
%扩大值%”的情况)删除。如果参数是@或,模式删除操作应用于依次在每个位置参数,最后扩展为结果的列表。如果参数是@或下标数组变量,模式删除操作应用于反过来数组的每个成员,最后扩展为结果的列表。
${parameter/pattern/string}
该模式被扩展为一个模式,就像路径扩展中一样。参数被扩展,针对其价值模式的最长匹配被替换为的字符串。如果图案/开始,模式的所有比赛都将替换为的字符串。通常只在第一场比赛被替换。如果pattern以#开头,它必须在参数扩展后的值的开头相匹配。如果pattern以%开始,它必须在参数扩展后的值的末尾匹配。如果字符串为空,图案的匹配被删除,并可以省略/下面的模式。如果参数是@或,替换操作应用于依次在每个位置参数,以及膨胀为结果的列表。如果参数是@或下标数组变量,替换操作应用于反过来阵列的每个成员,并且扩展为结果的列表。
${parameter^pattern}
${parameter^^pattern}
${parameter,pattern}
${parameter,,pattern}
案例修改。这种扩张的修改参数字母字符的情况。在参数扩展后的值的每个字符对模式进行测试,并且,如果它的模式匹配,它的情况下进行转换。该模式不应该尝试匹配多个字符。
Command Substitution
命令替换允许命令的输出,以替换命令名。
(command)和command‘bash执行执行命令和命令的标准输出替换命令替换,删除与任何尾随换行符的扩张。嵌入式换行符不会被删除,但它们可能字分离期间被除去。命令替换
(猫文件)可以通过等效但速度更快
(<文件)来代替。当使用替代旧式的反引号的形式,反斜杠保留其字面意思后面时,除了
`,或\。没有反斜杠后面的第一个反引号结束命令替换。当使用$(命令)的形式中,括号之间的所有字符组成命令;没有被特殊处理。
命令替换可以嵌套。巢使用从反引号时,逃生用反斜杠内反引号。
如果置换出现双引号内,分词和路径的扩展不会对结果进行。
Arithmetic Expansion
算术扩展允许算术表达式的评价和结果的替换。
((expression))旧格式
[expression]被弃用,并将在bash的未来版本中删除。
表达被视为好像它是双引号之内,但是在括号内使用双引号不会被特殊对待。在表达式中的所有令牌进行参数和变量扩展,命令替换和引用的删除。算术扩展可以嵌套。
Process Substitution
进程替换支持在支持命名管道(FIFO)或命名打开的文件在/ dev / FD方法的系统。它需要<(列表)或>(表)的形式。该进程列表与它的输入或输出连接到一个FIFO或者为/ dev / FD一些文件运行。该文件的名称作为参数传递给当前的命令作为扩展的结果获得通过。如果使用>(表)的形式,写入文件将为列表提供输入。如果使用了<(列表)的形式,作为一个参数传递的文件应该被读取,以获得表的输出。如果可用,与参数和变量扩展,命令替换和算术扩展同时执行进程替换。
Word Splitting(词的拆分)
shell扫描参数扩展,命令替换,而没有为分词双引号内发生算术扩展的结果。
shell把IFS的每个字符作为分隔符,另扩展的结果分成使用这些字符作为字段终止符的话。
Pathname Expansion(路径扩展)
词的拆分之后,除非-f选项已定,庆典扫描字符* ,?和[每个单词。如果出现这些字符之一,那么这个词被认为是一个模式,并与模式匹配的文件名的字母顺序排序列表取代.
如果没有找到匹配的文件名,在未启用shell选项nullglob,字保持不变。如果nullglob选项,将会被设置,并且没有找到匹配,这个词将被删除。如果文件水珠外壳选项设置,并且没有找到匹配,则打印错误消息,并且不执行命令。如果shell选项nocaseglob使能,而不考虑字母的情况下进行比赛。请注意,使用范围表达式就像当[A-Z](见下文),另一种情况的信件可能会根据LC_COLLATE的设置被列入。当一个图案用于路径名扩展时,字符。'出现在名称的开始或者紧随一个斜杠必须明确匹配,除非shell选项dotglob设置。当匹配路径,斜杠符必须始终明确匹配。在其他情况下,
。’字符不特殊对待。参见下SHELL内建命令禁用了javascript下面的描述为nocaseglob的描述,nullglob,失败全球,dotglob shell选项。
该GLOBIGNORE shell变量可以被用来限制集模式匹配的文件名。如果GLOBIGNORE被设置,每一个匹配的文件名也匹配GLOBIGNORE模式中的一个被从匹配的列表中删除。但是,设置GLOBIGNORE一个非空值已启用dotglob shell选项的效果,让其他所有文件名以。''将匹配开始。要获得忽略文件名的旧的行为有一个
开头的。”,使得“。*”在GLOBIGNORE的模式之一。当GLOBIGNORE没有设置的dotglob选项被禁用。
Pattern Matching
出现在模式中的任何字符,除了下面描述的特殊模式字符等,匹配自己。可以在图案不会出现空字符。反斜杠转义字符如下;匹配时逸出反斜线被丢弃。如果要匹配字面上的特殊模式字符必须被引用。
特殊模式字符具有以下含义:
* 匹配任何字符串,包括空字符串。
? 匹配任何单个字符。
[…] 匹配括起来的字符中的任何一个。
[产品类别:],其中类是在POSIX标准中定义的下列类之一在[和]字符类可以使用语法来指定:
alnum alpha ascii blank cntrl digit graph lower print punct space upper word xdigit
字符类匹配属于该类别的任何字符。字字符类匹配字母,数字和字符_。在[和],等价类可以使用语法[= C=],它匹配与具有相同校对重量的所有字符(由当前语言环境定义)的字符c被指定。
在[和]中,语法[.symbol]相匹配的排序符号象征。
?(pattern-list)
匹配零次或一次给定模式
*(pattern-list)
匹配零个或多个给定模式
+(pattern-list)
匹配给定模式中的一个或多个匹配
@(pattern-list)
匹配给定模式中的一个
!(pattern-list)
匹配任何东西,除了给定的模式之一
Quote Removal(引用删除)**
前述的扩展后,字符的所有未引用的出现\’,和“未从上述扩展被除去的一个结果。结果被视为算术表达式来进行评估。
评