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 "$@"

时比需要的更复杂