shell中有7中展开。展开的顺序是:大括号展开;波浪展开、参数和变量展开、算术展开和命令替换(以从左到右的方式完成);分词;和文件名扩展。
在支持它的系统上,还有一种额外的扩展:进程替换。这与波浪线、参数、变量、算术展开和命令替换同时执行。
在执行这些扩展之后,原始单词中的引号字符将被删除,除非它们本身被引号括起来(引号删除)。
只有大括号展开、分词和文件名展开才能增加展开的单词数;其他扩展将单个单词扩展为单个单词。唯一的例外是$ @和$ ∗ 以 及 *以及 ∗以及 {name[@]}和${name[*]}(见数组)的扩展。
大括号展开
大括号展开是一种可以生成任意字符串的机制。展开大括号的模式采用可选的前缀,后接一系列逗号分隔的字符串或一对大括号之间的序列表达式,后接可选的后缀。前缀与大括号中包含的每个字符串组合,然后将后缀附加到每个结果字符串,从左到右展开。
大括号展开可以嵌套。每个扩展字符串的结果都没有排序;从左到右的顺序保持不变。例如:
echo a{
d,c,b}e
ade ace abe
序列表达式的形式为
{x…y[…Incr]}
其中x和y是整数或单个字符,Incr是可选的增量,是一个整数。当提供整数时,表达式扩展为x和y之间的每个数字(包括x和y)。
echo {
1..10}
1 2 3 4 5 6 7 9 10
提供的整数可以加上’ 0 '前缀,以强制每个项具有相同的宽度。当x或y以0开头时,shell会试图强制所有生成的术语包含相同数量的数字,必要时还会进行零填充。
echo {
01..10}
01 02 03 04 05 06 07 08 09 10
echo {
0001..10}
0001 0002 0003 0004 0005 0006 0007 0008 0009 0010
当提供字符时,表达式使用默认的C语言环境,按字典顺序展开到x和y之间的每个字符(含)。
echo {
a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z
注意 :x和y必须是相同的类型。当提供增量时,它被用作每个项之间的差值。默认的增量是1或-1。
echo {
z..a..-1}
z y x w v u t s r q p o n m l k j i h g f e d c b a
echo {
1..10..2}
1 3 5 7 9
大括号展开在任何其他展开之前执行,任何其他展开的特殊字符都保留在结果中。它是严格的文本。Bash不会对展开上下文或大括号之间的文本应用任何语法解释。
正确格式的大括号展开必须包含不带引号的前括号和后括号,以及至少一个不带引号的逗号或有效的序列表达式。任何不正确形成的大括号展开都保持不变。
一个{或’,‘可以用反斜杠括起来,以防止被认为是大括号表达式的一部分。为了避免与参数展开冲突,字符串’ ${‘被认为不符合大括号展开的条件,并禁止大括号展开,直到结束的’}’。
当要生成的字符串的公共前缀比上面的例子中要长时,这个结构通常被用作一种简写:
mkdir -p /shelldir/{
test,test1,test2}
或者
chown root /usr/{
ucb/{
ex,edit},lib/{
ex?.?*,how_ex}}
波浪线扩展
如果一个单词以未加引号的斜杠字符(’ ~ ')开头,则第一个未加引号的斜杠之前的所有字符(如果没有加引号的斜杠,则所有字符)都被视为波浪前缀。如果波浪号前缀中的字符都没有被引用,那么波浪号后面的波浪号前缀中的字符将被视为可能的登录名。如果这个登录名是空字符串,则用shell变量HOME的值替换波浪号。如果没有设置HOME,则替换执行shell的用户的HOME目录。否则,波浪前缀将被替换为与指定登录名关联的主目录。
echo ~
/root
echo ~/
/root/
如果波浪前缀是’ ~+ ',则shell变量pwd的值将替换波浪前缀。
echo ~+
等价于
pwd
如果波浪符号前缀是’ ~- ',则shell变量oldpwd的值(如果它被设置了)将被替换。
ehco ~-
退回到上次目录
如果在波浪号前缀中,波浪号后面的字符由数字N组成,可选的前缀是’ + ‘或’ - ',波浪号前缀将被替换为目录堆栈中的相应元素,因为它会被内部调用的dirs显示,在波浪符号前缀中,波浪符号后面的字符作为参数(参见目录堆栈)。如果波浪线前缀(无波浪线)由一个没有“+”或“-”前导的数字组成,则假定为“+”。
e