为什么$ {@: - 1}不返回$ @的最后一个元素?

Zai*_*aid 18 bash

我想在此发布问答,因为我没有找到类似的东西.如果它已经存在,请将其标记为重复.


在Bash shell下运行的以下代码不起作用(应该只返回f,最后一个(第-1个)项$@):

$ set -- a b c d e f
$ echo ${@:-1}
a b c d e f
Run Code Online (Sandbox Code Playgroud)

Zai*_*aid 19

${parameter:-word}是一种参数扩展:

${parameter:-word}

如果参数未设置或为null,则替换单词的扩展.否则,参数的值将被替换.


所以${@:-1}被解释为:

  • 如果$@未设置或为null,则替换为1
  • 否则离开$@,因为它是

由于后者是真的,所以它的所有荣耀都是echo印刷品$@


修复:

:和之间放一些空格-:

$ echo ${@: -1}
f
Run Code Online (Sandbox Code Playgroud)


spi*_*nup 10

作为Zaid建议的空间的替代语法,您还可以使用圆括号来获得所需的功能:

echo ${@:(-1)}
Run Code Online (Sandbox Code Playgroud)

F

  • ++; 以免人们认为`(...)`创建了一个昂贵的_subshel​​l_(就像我原来的那样):它没有,因为数组下标范围是在_arithmetic_上下文中计算的(隐含的`$((...))`),所以使用`(...)`带有_no_性能惩罚(可以说). (2认同)