Can';t在bash中将大括号扩展与参数扩展相结合
我想回显$1$2$3和支架扩展。但它不起作用 展开顺序为:大括号展开、平铺展开、参数展开、变量展开、算术展开和命令替换(在 从左到右的方式)、分词和路径名扩展 根据bash手册,在参数扩展之前执行支架扩展 因此,我认为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..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