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

时间:2016-10-16 17:56:29

标签: bash

我想在此发布一个Q& A,因为我没有找到类似的东西。如果它已经存在,请将其标记为重复。

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

$ set -- a b c d e f
$ echo ${@:-1}
a b c d e f

3 个答案:

答案 0 :(得分:19)

${parameter:-word}是一种parameter expansion

  

<强> ${parameter:-word}

     

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

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

  • 如果$@未设置或为null,请使用1
  • 替换
  • 否则$@原样

由于后者属实,echo会在其所有荣耀中打印$@

修复:

:-

之间留出一些空格
$ echo ${@: -1}
f

答案 1 :(得分:10)

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

echo ${@:(-1)}
  

f

答案 2 :(得分:0)

一些解释

的手册页中查看 参数扩展 部分:

  
      
  • ${parameter:-word} - &gt; 使用默认值。如果参数未设置或为null,则会替换word的扩展...
  •   
  • ${parameter:=word} - &gt; 分配默认值。 如果参数未设置或为null,则将字的扩展分配给参数...
  •   
  • ${parameter:?word} - &gt; 如果为空或未设置则显示错误。 如果参数为null或未设置,则将字的扩展写入标准错误和shell,...
  •   
  • ...
  •   

如果${@:-1}为空,语法1将返回$@ ...

echo ${@:-1}
a b c d e f

set --
echo ${@:-1}
1

echo ${@:-It is.}
It is.

可以使用违反:-语法的任何内容来解决问题。

set -- alpha beta ceta delta enigma foo
echo ${@: -1} 
foo
echo ${@:0-1}
foo
echo ${@:(-1)}
foo
echo ${@:10#-1}
foo
echo ${@:1*-1}
foo

所有阵列都以相同的方式受到影响。

array=(Hello good world)

echo ${array[@]:-1}
Hello good world

echo ${array[@]:0-1}
world