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/zshalih-alih #!/bin/shsaya 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/zshbukan /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.
shiftdan 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?