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/zshvez de #!/bin/shsaber 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.
shifte 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?