bash中的花括号扩展
触发扩展条件
检测到一对花括号{}
,并在此内至少存在一个逗号,
,或者存在一个有效的序列表达式{x..y[..incr]}
,花括号和逗号未被反斜杠\
转义和未被单引号'
双引号"
包围,这时满足条件,触发花括号扩展Brace Expansion
。
1 | echo a{1,2}b #扩展 |
扩展条件有比较特殊的情况,首先,参数扩展模式为${}
同样有花括号,所以字符串${
不认为是有效的{
,不满足触发条件。
1 | set -- 2 #将参数$1的值设为2 |
其次特殊的情况,扩展不会发生在参数parameter
赋值中
A variable may be assigned to by a statement of the form
1 name=[value]If value is not given, the variable is assigned the null string. All values undergo tilde expansion, parameter and variable expansion, command substitution, arithmetic expansion, and quote removal
Bash Reference Manual在参数的部分中提到的扩展是没有花括号扩展的
1 | str=a{1,2}b #str的值就为a{1,2}b |
扩展行为
逗号情况中,会将逗号视作分隔符,扩展为花括号中被分割的每一项,如果逗号在首位也是会分割的,分割得到空值。扩展的顺序为花括号内顺序,不会主动进行排序。
1 | echo a{1,2}b |
{x..y[..incr]}
为序列表达式,xy
可为整数或者字母,可选值incr
为整数作用与xy
之间的增量
1 | echo a{1..6}b |
扩展中的特殊符号
如果花括号内逗号分割的是带反斜杠转义或者单双括号包围起来的元字符metacharater
,那么就当字面意义上的字符对待,保留字reserved words
同理
1 | echo {\|,\&,\;,\(,\),\ ,$'\t',$'\n','<',\>} |
由于$
不是元字符,只要后面不跟{
它在花括号扩展中只是一个字面意义上的普通字符
1 | a='Im a' |