3
$ set a b c
$ echo $1 $2 $3
a b c
$ echo ${1..3}
-bash: ${1..3}: bad substitution

我想用大括号扩展来回应 $1 $2 $3。但它不起作用。

扩展的顺序是:大括号扩展、波浪号扩展、参数、变量和算术扩展以及命令替换(以从左到右的方式完成)、分词和路径名扩展。

根据bash手册,大括号扩展是在参数扩展之前进行的。

所以我认为 bash 应该先进行大括号扩展${1..3},将其转换为echo $1 $2 $3,然后进行参数扩展。

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

PS:谢谢你们!你们所有的答案都很棒。但我认为

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

4

2 回答 2

6

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

请尝试“${@:1:3}”。

于 2015-09-14T05:26:03.613 回答
3

伊格纳西奥的回答是正确的做法,但这里有一些关于如何让它按照你开始的方式工作的更多细节。

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

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

正如您所注意到的,它输出美元表达式而不评估它们。那是因为引号删除(转换\$回的部分$)是在参数扩展之后执行的。所以我们需要通过以下方式运行它eval

user$ eval echo \${1..3}
a b c

当它可以写成时比需要的更复杂echo "$@"

于 2015-09-14T09:01:34.623 回答