Qual é a melhor maneira de implementar print_last_arg
?
#!/bin/sh
print_last_arg () {
eval "echo \${$#}" # this hurts
}
print_last_arg foo bar baz
# baz
(Se assim fosse, digamos, em #!/usr/bin/zsh
vez de #!/bin/sh
saber o que fazer. Meu problema é encontrar uma maneira razoável de implementar isso #!/bin/sh
.)
EDIT: O acima é apenas um exemplo bobo. Meu objetivo não é imprimir o último argumento, mas sim ter uma maneira de me referir ao último argumento dentro de uma função shell.
EDIT2: Peço desculpas por uma pergunta tão pouco clara. Espero acertar desta vez.
Se isso fosse /bin/zsh
, em vez de /bin/sh
, eu poderia escrever algo como isto
#!/bin/zsh
print_last_arg () {
local last_arg=$argv[$#]
echo $last_arg
}
A expressão $argv[$#]
é um exemplo do que descrevi na minha primeira edição como uma maneira de se referir ao último argumento dentro de uma função shell .
Portanto, eu realmente deveria ter escrito meu exemplo original assim:
print_last_arg () {
local last_arg=$(eval "echo \${$#}") # but this hurts even more
echo $last_arg
}
... para deixar claro que o que estou procurando é uma coisa menos terrível para colocar à direita da tarefa.
Observe, no entanto, que em todos os exemplos, o último argumento é acessado de maneira não destrutiva . IOW, o acesso ao último argumento não afeta os argumentos posicionais como um todo.
var=$( eval echo \${$#})
a eval var=\${$#}
- os dois não são iguais.
shift
e set -- ...
baseadas podem ser destrutivas, a menos que sejam usadas em funções onde também são inofensivas.
eval "var=\${$#}"
quando comparado, var=${arr[evaled index]}
exceto que esse $#
é um valor seguro garantido. por que copiar todo o conjunto e destruí-lo quando você pode indexá-lo diretamente?