我在bash中有一个简单的函数,我想接受任意数量的参数。我想做的是回显传递给函数的最后一个参数,然后移动,并重复,直到我没有参数。
下面是我的代码:test(){
while [ $# -ne 0 ]
do
echo "${@: -1}"
shift
done
}
然而,这种转变似乎并没有发生。
如果我运行:
test a b c d
它将返回
d
d
d
d
显然我想返回
d
c
b
a
我做错了什么?谢谢!:)
shift
不删除最后一个参数,它删除了第一个参数。$2
变成$1
, $3
变成$2
,等等。d
将永远是最后一个参数,因为项将从前面弹出。
如果你想以相反的顺序打印所有的参数,我建议:
for ((i = $#; i > 0; --i)); do
echo "${!i}"
done
或者,您可以模仿从右侧移动:
while (($# > 0)); do
echo "${@: -1}"
set -- "${@:1:$#-1}"
done
同样,${@: -1}
的另一种写法是${!#}
。不过,这可能太聪明了。这种技巧在一些难以理解的Perl脚本中可以看到。
另一种说法:
revargs() {
local sgra=()
for arg; do sgra=("$arg" "${sgra[@]}"); done
printf "%sn" "${sgra[@]}"
}
revargs foo bar baz qux
qux
baz
bar
foo
我突然想到:它很俗气,但它很短。
revargs() {
printf "%sn" "$@" | tac
}