Qual è un modo migliore per implementare print_last_arg?
#!/bin/sh
print_last_arg () {
eval "echo \${$#}" # this hurts
}
print_last_arg foo bar baz
# baz
(Se questo fosse, diciamo, #!/usr/bin/zshinvece di #!/bin/shsapere cosa fare. Il mio problema è trovare un modo ragionevole per implementarlo #!/bin/sh.)
EDIT: quanto sopra è solo un esempio sciocco. Il mio obiettivo non è quello di stampare l'ultimo argomento, ma piuttosto di avere un modo per fare riferimento all'ultimo argomento all'interno di una funzione shell.
EDIT2: mi scuso per una domanda così poco chiara. Spero di farlo bene questa volta.
Se questo fosse /bin/zshal posto di /bin/sh, potrei scrivere qualcosa di simile
#!/bin/zsh
print_last_arg () {
local last_arg=$argv[$#]
echo $last_arg
}
L'espressione $argv[$#]è un esempio di ciò che ho descritto nel mio primo EDIT come un modo per fare riferimento all'ultimo argomento all'interno di una funzione shell .
Pertanto, avrei davvero dovuto scrivere il mio esempio originale in questo modo:
print_last_arg () {
local last_arg=$(eval "echo \${$#}") # but this hurts even more
echo $last_arg
}
... per chiarire che quello che sto cercando è una cosa meno terribile da mettere a destra dell'incarico.
Si noti, tuttavia, che in tutti gli esempi, si accede all'ultimo argomento in modo non distruttivo . IOW, l'accesso all'ultimo argomento lascia inalterati gli argomenti posizionali.
var=$( eval echo \${$#})a eval var=\${$#}- i due sono niente uguali.
shifte set -- ...potrebbero essere distruttive se non utilizzate in funzioni in cui sono anche innocue.
eval "var=\${$#}"rispetto a var=${arr[evaled index]}tranne che $#è un valore sicuro garantito. perché copiare l'intero set e poi distruggerlo quando potresti semplicemente indicizzarlo direttamente?