man bash 7 扩展

扩展(expansion)

当命令行被分离成单词后扩展被执行。有七种扩展:花括号扩展(brace expansion),波浪字符扩展(tilde expansion),变量扩展(parameter and variable expansion),命令替换(command substitution),算术扩展(arithmetic expansion),单词分离(word splitting)和路径名扩展(pathname expansion)。

扩展的顺序是:花括号扩展,波浪字符扩展,变量、算术扩展和命令替换(从左到右),单词分离和路径名扩展。

在支持的系统上,有一种额外的扩展:进程替换(process substitution)。

只有花括号扩展,单词分离和路径名扩展能改变扩展的单词的数目;其他的扩展将单一的单词扩展成单一的单词。唯一的例外就是"$@"和"${name[@]}"的扩展。

花括号扩展(brace expansion)

花括号扩展(brace expansion)是一种机制,通过它可以生成任意的字符串。这个机制类似于路径名扩展,但是生成的文件名不需要存在。花括号扩展的模式有以下形式:一个可选前文,一对花括号,中间是一系列由逗号分隔的字符串或者序列表达式,一个可选后文。前文被添加到花括号中的每一个字符串之前,结果再附上后文,扩展从左向右发生。

花括号扩展可以嵌套。扩展的结果不排序;从左向右的顺序被保留。例如,a{d,c,b}e扩展成'ade ace abe'。

序列表达式(sequence expression)的形式为{x..y[..incr]},x和y是整数或者单一字符,incr是个可选的增量,是个整数。如果是整数,表达式扩展成x和y(包括x和y)之间的每个数字。可以在提供的整数前面添加0,这样每一个结果有相同的宽度。如果x或者y以0开始,shell会尝试让生成的结果有相同的数字个数,如果需要,填充0。如果是字符,表达式扩展成x和y(包括x和y)至于的每一个字符(字典序)。注意x和y有相同的类型。如果有增量,它被用作两个结果之间的差。默认的增量为1或者-1。

花括号扩展发生在其他扩展之前,对其他扩展而言有特殊意义的字符会在结果中保留。它是严格文字上的。bash对扩展的上下文或者花括号中文本不提供语法上的解释。

正确格式的花括号扩展必须包括未引用的开闭花括号,至少一个未引用的逗号或者一个合法的序列表达式。任何格式不正确的花括号扩展被保留,{或者,可以被反斜线引用来防止被认为是花括号扩展的一部分。未避免和变量扩展冲突,字符串${不认为是花括号扩展。

如果生成的字符串的通用前缀要更长的时候,这个构造典型用作简写,例如:

mkdir /usr/local/src/bash/{old,new,dist,bugs}

或者

chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}

花括号扩展对于历史版本的sh引入一些不兼容。如果花括号作为一部分出现在单词中,sh不会对它们特殊对待,并在结果中保留。作为花括号扩展的结果,bash从单词中移除花括号。例如,对于sh,输入file{1,2},输出还是一样的。对于bash,结果就是file1 file2。如果需要严格兼容sh,以+B选项启动bash,或者使用set +B来禁用花括号扩展。

波浪字符扩展(tilde expansion)

变量扩展(parameter expansion)

命令替换(comand substitution)

算术扩展(arithmetic expansion)

进程替换(process substitution)

单词分离(word splitting)

路径名扩展(pathname expansion)

模式匹配(pattern matching)

引用移除(quote removal)


你可能感兴趣的:(man bash 7 扩展)