我想在此发布一个Q& A,因为我没有找到类似的东西。如果它已经存在,请将其标记为重复。
以下代码在Bash shell下运行,不起作用(应仅返回f
,$@
中的最后一个(第-1个)项:
$ set -- a b c d e f
$ echo ${@:-1}
a b c d e f
答案 0 :(得分:19)
${parameter:-word}
是一种parameter expansion:<强>
${parameter:-word}
强>如果参数未设置或为null,则替换单词的扩展。 否则,参数的值将被替换。
所以${@:-1}
被解释为:
$@
未设置或为null,请使用1
$@
原样由于后者属实,echo
会在其所有荣耀中打印$@
在:
和-
:
$ echo ${@: -1}
f
答案 1 :(得分:10)
作为Zaid建议空间的替代语法,您还可以使用圆括号来获得所需的功能:
echo ${@:(-1)}
f
答案 2 :(得分:0)
在bash的手册页中查看 参数扩展 部分:
${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