我想发布一个关于这个的问答,因为我没有找到任何类似的东西。如果已经存在,请将其标记为副本。
在Bash shell下运行的以下代码不起作用(应该只返回$@
中的最后一个(第-1个)项f
):
$ set -- a b c d e f
$ echo ${@:-1}
a b c d e f
发布于 2016-10-17 01:56:29
${parameter:-word}
是parameter expansion的一种
${parameter:-word}
如果参数未设置或为null,则替换word的扩展。否则,将替换参数的值。
因此,${@:-1}
被解释为:
1
$@
未设置或为null,则替换为将$@
保留为因为后者是真的,所以echo
打印$@
是非常出色的
解决方法:
在:
和-
之间留出一些空间
$ echo ${@: -1}
f
发布于 2016-10-17 02:52:37
作为Zaid建议的空格的替代语法,您还可以使用圆括号来获得所需的功能:
echo ${@:(-1)}
f
发布于 2016-11-06 20:20:45
一些解释
请查看bash手册页中的参数扩展一节:
${parameter:-word}
-> 使用默认值。如果参数为未设置或null,则word的展开为substituted...${parameter:=word}
-> 赋值默认值。如果参数为未设置或null,则word的展开将分配给parameter...${parameter:?word}
-> Display error。如果参数为Null或未设置,则word的展开将被写入标准错误和外壳程序,如果$@
为空,语法${@:-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
https://stackoverflow.com/questions/40073530
复制相似问题