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



我在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
}

相关内容

最新更新