Quelle meilleure façon de mettre en œuvre print_last_arg
?
#!/bin/sh
print_last_arg () {
eval "echo \${$#}" # this hurts
}
print_last_arg foo bar baz
# baz
(Si c'était le cas, par exemple, #!/usr/bin/zsh
au lieu de #!/bin/sh
je saurais quoi faire. Mon problème est de trouver un moyen raisonnable de mettre cela en œuvre #!/bin/sh
.)
EDIT: Ce qui précède n'est qu'un exemple stupide. Mon objectif n'est pas d' imprimer le dernier argument, mais plutôt d'avoir un moyen de faire référence au dernier argument dans une fonction shell.
EDIT2: Je m'excuse pour une question si peu formulée. J'espère bien faire les choses cette fois.
Si tel était au /bin/zsh
lieu de /bin/sh
, je pourrais écrire quelque chose comme ça
#!/bin/zsh
print_last_arg () {
local last_arg=$argv[$#]
echo $last_arg
}
L'expression $argv[$#]
est un exemple de ce que j'ai décrit dans mon premier EDIT comme un moyen de faire référence au dernier argument d'une fonction shell .
Par conséquent, j'aurais vraiment dû écrire mon exemple original comme ceci:
print_last_arg () {
local last_arg=$(eval "echo \${$#}") # but this hurts even more
echo $last_arg
}
... pour préciser que ce que je recherche est une chose moins horrible à mettre à droite de la mission.
Notez cependant que dans tous les exemples, le dernier argument est accessible de manière non destructive . IOW, l'accès au dernier argument ne modifie pas les arguments positionnels dans leur ensemble.
var=$( eval echo \${$#})
à eval var=\${$#}
- les deux ne sont rien pareils.
shift
et set -- ...
solutions pourraient être destructrices moins utilisées dans les fonctions où ils sont trop inoffensifs.
eval "var=\${$#}"
par rapport à, var=${arr[evaled index]}
sauf qu'il $#
s'agit d'une valeur sûre garantie. pourquoi copier l'ensemble entier puis le détruire alors que vous pouvez simplement l'indexer directement?