访问bash函数中传递的最后一个参数,然后移动它

时间:2014-06-26 22:51:50

标签: bash

我在bash中有一个简单的函数,我想接受任意数量的参数。我想做的是回复传递给函数的最后一个参数,然后移位,重复直到我没有参数。

这是我的代码:

test(){
    while [ $# -ne 0 ]
    do
        echo "${@: -1}"
        shift  
    done
}

然而,这种转变似乎并未发生。

如果我跑:

test a b c d

它会返回

d
d
d
d

而我显然想回来

d
c
b
a

我做错了什么?谢谢! :)

2 个答案:

答案 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
}