Um conceito simples, sem aritmética, sem loop, sem eval , apenas funciona.
Lembre-se que o shell Bourne não tinha aritmética (% externo necessárioexpr
). Se quiser obter uma livre aritmética, eval
free choice, esta é uma opção. A necessidade de funções significa SVR3 ou superior (sem sobregravação de parâmetros).
Veja abaixo uma versão mais robusta com printf.
printlast(){
shift "$1"
echo "$1"
}
printlast "$#" "$@" ### you may use ${1+"$@"} here to allow
### a Bourne empty list of arguments,
### but wait for a correct solution below.
Essa estrutura para chamar printlast
é fixa , os argumentos precisam ser configurados na lista de argumentos de shell $1
, $2
, etc. (a pilha de argumentos) e a chamada feito como determinado.
Se a lista de argumentos precisar ser alterada, basta defini-los:
set -- o1e t2o t3r f4u
printlast "$#" "$@"
Ou crie uma função mais fácil de usar ( getlast
) que possa permitir argumentos genéricos (mas não tão rápido, os argumentos são passados duas vezes).
getlast(){ printlast "$#" "$@"; }
getlast o1e t2o t3r f4u
Por favor, note que argumentos (de getlast
, ou todos incluídos em $@
para printlast) podem ter espaços, novas linhas, etc. Mas não NUL.
Melhor
Esta versão não imprime 0
quando a lista de argumentos está vazia,
e use o printf mais robusto (volte para echo
se external printf
não estiver disponível para shells antigos).
printlast(){ shift "$1"; printf '%s' "$1"; }
getlast () if [ $# -gt 0 ]
then printlast "$#" "$@"
echo ### optional if a trailing newline is wanted.
fi
### The {} braces were removed on purpose.
getlast 1 2 3 4 # will print 4
Usando EVAL.
Se o shell Bourne for ainda mais antigo e não houver funções, ou se, por algum motivo, o uso de eval for a única opção:
Para imprimir o valor:
if [ $# -gt 0 ]
then eval printf "'1%s\n'" \"\$\{$#\}\"
fi
Para definir o valor em uma variável:
if [ $# -gt 0 ]
then eval 'last_arg='\"\$\{$#\}\"
fi
Se isso precisa ser feito em uma função, os argumentos precisam ser copiados para a função:
print_last_arg () {
local last_arg ### local only works on more modern shells.
eval 'last_arg='\"\$\{$#\}\"
echo "last_arg3=$last_arg"
}
print_last_arg "$@" ### Shell arguments are sent to the function.