¿Cuál es una mejor manera de implementar print_last_arg?
#!/bin/sh
print_last_arg () {
eval "echo \${$#}" # this hurts
}
print_last_arg foo bar baz
# baz
(Si esto fuera, digamos, en #!/usr/bin/zshlugar de #!/bin/shsaber qué hacer. Mi problema es encontrar una forma razonable de implementar esto #!/bin/sh).
EDITAR: Lo anterior es solo un ejemplo tonto. Mi objetivo no es imprimir el último argumento, sino tener una manera de referirme al último argumento dentro de una función de shell.
EDIT2: Pido disculpas por una pregunta tan poco clara. Espero hacerlo bien esta vez.
Si esto fuera en /bin/zshlugar de /bin/sh, podría escribir algo como esto
#!/bin/zsh
print_last_arg () {
local last_arg=$argv[$#]
echo $last_arg
}
La expresión $argv[$#]es un ejemplo de lo que describí en mi primer EDIT como una forma de referirme al último argumento dentro de una función de shell .
Por lo tanto, realmente debería haber escrito mi ejemplo original así:
print_last_arg () {
local last_arg=$(eval "echo \${$#}") # but this hurts even more
echo $last_arg
}
... para dejar en claro que lo que busco es algo menos horrible de poner a la derecha de la tarea.
Sin embargo, tenga en cuenta que en todos los ejemplos, se accede al último argumento de forma no destructiva . IOW, el acceso al último argumento deja los argumentos posicionales en su conjunto sin verse afectados.
var=$( eval echo \${$#})a eval var=\${$#}- los dos son nada igual.
shifty set -- ...basadas pueden ser destructivas a menos que se utilicen en funciones donde también son inofensivas.
eval "var=\${$#}"en comparación con, var=${arr[evaled index]}excepto que $#es un valor seguro garantizado. ¿Por qué copiar todo el conjunto y luego destruirlo cuando puedes indexarlo directamente?