我在bash中有一个简单的函数,我想接受任意数量的参数。我想做的是回复传递给函数的最后一个参数,然后移位,重复直到我没有参数。
这是我的代码:
test(){
while [ $# -ne 0 ]
do
echo "${@: -1}"
shift
done
}
然而,这种转变似乎并未发生。
如果我跑:
test a b c d
它会返回
d
d
d
d
而我显然想回来
d
c
b
a
我做错了什么?谢谢! :)
答案 0 :(得分:4)
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脚本中看到的。
答案 1 :(得分:1)
另一种方式:
revargs() {
local sgra=()
for arg; do sgra=("$arg" "${sgra[@]}"); done
printf "%s\n" "${sgra[@]}"
}
revargs foo bar baz qux
qux
baz
bar
foo
这刚刚发生在我身上:它非常俗气,但它很短。
revargs() {
printf "%s\n" "$@" | tac
}