Can';t在bash中将大括号扩展与参数扩展相结合

Can';t在bash中将大括号扩展与参数扩展相结合,bash,brace-expansion,parameter-expansion,Bash,Brace Expansion,Parameter Expansion,我想回显$1$2$3和支架扩展。但它不起作用 展开顺序为:大括号展开、平铺展开、参数展开、变量展开、算术展开和命令替换(在 从左到右的方式)、分词和路径名扩展 根据bash手册,在参数扩展之前执行支架扩展 因此,我认为bash应该首先对${1..3}执行大括号扩展,将其转换为echo$1$2$3,然后执行参数扩展 然而,事实是bash抱怨${1..3}是一个糟糕的替代。 为什么呢 附言: 谢谢你们!你们的答案都很好,但我认为 Ignacio Vazquez Abrams的答案更接近我想要的。它认

我想回显$1$2$3和支架扩展。但它不起作用

展开顺序为:大括号展开、平铺展开、参数展开、变量展开、算术展开和命令替换(在 从左到右的方式)、分词和路径名扩展

根据bash手册,在参数扩展之前执行支架扩展

因此,我认为bash应该首先对
${1..3}
执行大括号扩展,将其转换为
echo$1$2$3
,然后执行参数扩展

然而,事实是bash抱怨
${1..3}
是一个糟糕的替代。 为什么呢

附言: 谢谢你们!你们的答案都很好,但我认为


Ignacio Vazquez Abrams的答案更接近我想要的。

它认为大括号是参数替换的一部分,因为它跟在一个美元符号后面,“$1..3”是一个无效的变量名

试试“${@:1:3}”吧。

是正确的方法,但这里有一些更详细的信息,说明如何让它以您开始的方式工作

您希望
${1..3}
扩展到
$1$2$3
。我们不能连接
$
{1..3}
并使其工作,否则bash会将其解释为参数扩展(并失败)。要将其解释为括号扩展,请通过转义来抵消美元符号:

$ set a b c
$ echo $1 $2 $3
a b c
$ echo ${1..3}
-bash: ${1..3}: bad substitution
正如您所注意到的,它输出美元表达式而不计算它们。这是因为引号删除(将
\$
转换回
$
的部分)是在参数扩展后执行的。所以我们需要通过
eval
运行它:

user$ echo \${1..3}
$1 $2 $3

当它可以写为
echo“$@”

时比需要更复杂,但不应将其解释为建议使用
eval
user$ eval echo \${1..3}
a b c