bash 中无法将大括号扩展与参数扩展结合使用
Can't combine brace expansion with parameter expansion in bash
$ set a b c
$ echo
a b c
$ echo ${1..3}
-bash: ${1..3}: bad substitution
我想用大括号扩展来回显 $1 $2 $3。但是没用。
The order of expansions is: brace expansion, tilde expansion, parameter, variable and arithmetic expansion and command substitution (done in a
left-to-right fashion), word splitting, and pathname expansion.
根据bash手册,大括号展开先于参数展开。
所以我觉得bash应该先对${1..3}
做大括号展开,再转成echo
,再进行参数展开。
然而,事实是 bash 抱怨 ${1..3}
是一个错误的替换。
这是为什么?
PS:
谢谢大家!你们的答案都是wonderful.But我想
Ignacio Vazquez-Abrams 的回答更接近我想要的。
它认为大括号是参数替换的一部分,因为它跟在一个美元符号之后,并且“$1..3”是一个无效的变量名。
改用“${@:1:3}”。
是正确的做法,但这里有一些关于如何让它按照您开始的方式工作的更多细节。
您希望 ${1..3}
扩展到
。我们不能连接 $
和 {1..3}
并使其工作,否则 bash 会将其解释为参数扩展(并失败)。要将其解释为大括号扩展,请通过转义来中和美元符号:
user$ echo ${1..3}
如您所见,它输出美元表达式而不对它们求值。这是因为引号删除(将 $
转换回 $
的部分)是在参数扩展之后执行的。所以我们需要 运行 通过 eval
:
user$ eval echo ${1..3}
a b c
当它可以写成 echo "$@"
时比需要的更复杂
$ set a b c
$ echo
a b c
$ echo ${1..3}
-bash: ${1..3}: bad substitution
我想用大括号扩展来回显 $1 $2 $3。但是没用。
The order of expansions is: brace expansion, tilde expansion, parameter, variable and arithmetic expansion and command substitution (done in a left-to-right fashion), word splitting, and pathname expansion.
根据bash手册,大括号展开先于参数展开。
所以我觉得bash应该先对${1..3}
做大括号展开,再转成echo
,再进行参数展开。
然而,事实是 bash 抱怨 ${1..3}
是一个错误的替换。
这是为什么?
PS: 谢谢大家!你们的答案都是wonderful.But我想
Ignacio Vazquez-Abrams 的回答更接近我想要的。
它认为大括号是参数替换的一部分,因为它跟在一个美元符号之后,并且“$1..3”是一个无效的变量名。
改用“${@:1:3}”。
您希望 ${1..3}
扩展到
。我们不能连接 $
和 {1..3}
并使其工作,否则 bash 会将其解释为参数扩展(并失败)。要将其解释为大括号扩展,请通过转义来中和美元符号:
user$ echo ${1..3}
如您所见,它输出美元表达式而不对它们求值。这是因为引号删除(将 $
转换回 $
的部分)是在参数扩展之后执行的。所以我们需要 运行 通过 eval
:
user$ eval echo ${1..3}
a b c
当它可以写成 echo "$@"