有什么更好的实施方法print_last_arg
?
#!/bin/sh
print_last_arg () {
eval "echo \${$#}" # this hurts
}
print_last_arg foo bar baz
# baz
(如果#!/usr/bin/zsh
不是这样,那么#!/bin/sh
我不知道该怎么办。我的问题是找到一种合理的方法来实现#!/bin/sh
。)
编辑:上面只是一个愚蠢的例子。我的目标不是打印最后一个参数,而是要有一种方法来引用Shell函数中的最后一个参数。
EDIT2:对于这样一个措辞不清楚的问题,我深表歉意。 我希望这次能做对。
如果/bin/zsh
不是/bin/sh
,我可以写这样的东西
#!/bin/zsh
print_last_arg () {
local last_arg=$argv[$#]
echo $last_arg
}
该表达式$argv[$#]
是我在第一次EDIT中描述的一个示例,该引用是引用Shell函数中最后一个参数的方式。
因此,我真的应该像这样写我的原始示例:
print_last_arg () {
local last_arg=$(eval "echo \${$#}") # but this hurts even more
echo $last_arg
}
……清楚地说,我要做的只是放在作业右边的一件不太可怕的事情。
但是请注意,在所有示例中,最后一个参数都是无损访问的。IOW,最后一个参数的访问使位置参数作为一个整体不受影响。
var=$( eval echo \${$#})
于eval var=\${$#}
-两者完全不同。
shift
和set -- ...
除非他们是无害的,太功能使用基础的解决方案可能是破坏性的。
eval "var=\${$#}"
相比,这样做没有什么明显的区别,var=${arr[evaled index]}
只是$#
保证的安全值。为什么要复制整个集合然后在直接索引的情况下销毁它呢?