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/zsh
invece di #!/bin/sh
sapere 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/zsh
al 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.
shift
e 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?