Apa cara yang lebih baik untuk diterapkan print_last_arg
?
#!/bin/sh
print_last_arg () {
eval "echo \${$#}" # this hurts
}
print_last_arg foo bar baz
# baz
(Jika ini, katakanlah, #!/usr/bin/zsh
alih-alih #!/bin/sh
saya tahu apa yang harus dilakukan. Masalah saya adalah menemukan cara yang masuk akal untuk mengimplementasikannya #!/bin/sh
.)
EDIT: Di atas hanyalah contoh konyol. Tujuan saya bukan untuk mencetak argumen terakhir, tetapi untuk memiliki cara untuk merujuk ke argumen terakhir dalam fungsi shell.
EDIT2: Saya minta maaf atas pertanyaan yang tidak jelas. Saya berharap bisa melakukannya dengan benar kali ini.
Jika ini /bin/zsh
bukan /bin/sh
, saya bisa menulis sesuatu seperti ini
#!/bin/zsh
print_last_arg () {
local last_arg=$argv[$#]
echo $last_arg
}
Ekspresi $argv[$#]
adalah contoh dari apa yang saya jelaskan di EDIT pertama saya sebagai cara untuk merujuk ke argumen terakhir dalam fungsi shell .
Karena itu, saya seharusnya menulis contoh asli saya seperti ini:
print_last_arg () {
local last_arg=$(eval "echo \${$#}") # but this hurts even more
echo $last_arg
}
... untuk memperjelas bahwa apa yang saya kejar adalah hal yang kurang mengerikan untuk diletakkan di sebelah kanan penugasan.
Namun, perhatikan bahwa dalam semua contoh, argumen terakhir diakses secara non-destruktif . TKI, mengakses argumen terakhir membuat argumen posisi secara keseluruhan tidak terpengaruh.
var=$( eval echo \${$#})
ke eval var=\${$#}
- keduanya tidak sama.
shift
dan set -- ...
solusi berbasis mungkin merusak kecuali digunakan dalam fungsi di mana mereka juga tidak berbahaya.
eval "var=\${$#}"
jika dilakukan dibandingkan dengan var=${arr[evaled index]}
kecuali itu $#
adalah nilai aman yang dijamin. mengapa menyalin seluruh set lalu menghancurkannya ketika Anda bisa langsung mengindeksnya?