実装するより良い方法は何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
。)
編集:上記はばかげた例にすぎません。私の目標はしないが、印刷最後の引数をではなく、シェル関数内で最後の引数を参照する方法を持っています。
EDIT2:私はそのような不明確な言葉の質問をお詫び申し上げます。 今回はうまくいきたいです。
これがの/bin/zsh
代わりだったら/bin/sh
、私はこのようなものを書くことができます
#!/bin/zsh
print_last_arg () {
local last_arg=$argv[$#]
echo $last_arg
}
式$argv[$#]
は、シェル関数内の最後の引数を参照する方法として最初のEDITで説明したものの例です。
したがって、私は本当に次のように私の元の例を書くべきでした:
print_last_arg () {
local last_arg=$(eval "echo \${$#}") # but this hurts even more
echo $last_arg
}
...私が求めているのは、割り当ての右側に置くのはそれほどひどくないことであることを明確にするためです。
ただし、すべての例で、最後の引数は非破壊的にアクセスされることに注意してください。IOW、最後の引数にアクセスしても、全体として位置引数は影響を受けません。
var=$( eval echo \${$#})
にすべきではありません-2 eval var=\${$#}
つは似ていません。
shift
、set -- ...
ベースのソリューションのみが破壊的である可能性があります。
eval "var=\${$#}"
れvar=${arr[evaled index]}
ていることを除いて$#
、実行することに関して大きな違いはありません。セット全体をコピーして、直接インデックスを作成できるのにセットを破棄するのはなぜですか?