Uygulamanın daha iyi bir yolu nedir print_last_arg?
#!/bin/sh
print_last_arg () {
eval "echo \${$#}" # this hurts
}
print_last_arg foo bar baz
# baz
(Diyelim ki, ne yapmam gerektiğini bilmek #!/usr/bin/zshyerine #!/bin/sh. Sorunum bunu uygulamak için makul bir yol bulmak #!/bin/sh.)
EDIT: Yukarıdaki sadece saçma bir örnektir. Amacım son argümanı basmak değil , bir kabuk fonksiyonundaki son argümana atıfta bulunmanın bir yolunu bulmak.
EDIT2: Bu kadar belirsiz ifade edilen bir soru için özür dilerim. Bu sefer doğru yapmayı umuyorum.
Bu olsaydı /bin/zshyerine /bin/sh, böyle bir şey yazabilirsiniz
#!/bin/zsh
print_last_arg () {
local last_arg=$argv[$#]
echo $last_arg
}
İfade $argv[$#], bir kabuk işlevi içindeki son argümana başvurmanın bir yolu olarak ilk EDIT'imde tanımladığım şeyin bir örneğidir .
Bu nedenle, orijinal örneğimi böyle yazmalıydım:
print_last_arg () {
local last_arg=$(eval "echo \${$#}") # but this hurts even more
echo $last_arg
}
... daha sonra olduğum şeyin görevin sağına koymak için daha az korkunç bir şey olduğunu netleştirmek için.
Bununla birlikte, tüm örneklerde, son argümana tahribatsız olarak erişildiğini unutmayın . IOW, son argümana erişim konumsal argümanları bir bütün olarak etkilemez.
var=$( eval echo \${$#})için eval var=\${$#}iki benzer bir şey değildir -.
shiftve set -- ...temelli çözümler, zararsız oldukları işlevlerde kullanılmadıkça yıkıcı olabilir.
eval "var=\${$#}"olması var=${arr[evaled index]}dışında, yapmaktan önemli ölçüde farklı bir şey yoktur $#. neden tüm seti kopyalayıp doğrudan indeksleyebiliyorsanız onu yok etmelisiniz?