Was ist ein besserer Weg, um zu implementieren print_last_arg
?
#!/bin/sh
print_last_arg () {
eval "echo \${$#}" # this hurts
}
print_last_arg foo bar baz
# baz
(Wenn dies beispielsweise wäre, #!/usr/bin/zsh
anstatt zu #!/bin/sh
wissen, was zu tun ist. Mein Problem besteht darin, einen vernünftigen Weg zu finden, dies zu implementieren #!/bin/sh
.)
EDIT: Das obige ist nur ein dummes Beispiel. Mein Ziel ist es nicht, das letzte Argument zu drucken , sondern eine Möglichkeit zu haben, auf das letzte Argument innerhalb einer Shell-Funktion zu verweisen.
EDIT2: Ich entschuldige mich für eine so unklar formulierte Frage. Ich hoffe, es diesmal richtig zu machen.
Wenn dies /bin/zsh
stattdessen wäre /bin/sh
, könnte ich so etwas schreiben
#!/bin/zsh
print_last_arg () {
local last_arg=$argv[$#]
echo $last_arg
}
Der Ausdruck $argv[$#]
ist ein Beispiel für das, was ich in meiner ersten EDIT beschrieben habe , um auf das letzte Argument innerhalb einer Shell-Funktion zu verweisen .
Deshalb hätte ich mein ursprüngliches Beispiel wirklich so schreiben sollen:
print_last_arg () {
local last_arg=$(eval "echo \${$#}") # but this hurts even more
echo $last_arg
}
... um klar zu machen, dass das, wonach ich suche, eine weniger schreckliche Sache ist, die ich rechts von der Aufgabe setzen muss.
Beachten Sie jedoch, dass in allen Beispielen zerstörungsfrei auf das letzte Argument zugegriffen wird . IOW, der Zugriff auf das letzte Argument lässt die Positionsargumente insgesamt unberührt.
var=$( eval echo \${$#})
zu eval var=\${$#}
- die beiden nichts gleicht dem anderen .
shift
und set -- ...
basierte Lösungen können destruktiv sein, wenn sie nicht in Funktionen verwendet werden, in denen sie auch harmlos sind.
eval "var=\${$#}"
als var=${arr[evaled index]}
dass dies $#
ein garantierter sicherer Wert ist. Warum das ganze Set kopieren und dann zerstören, wenn Sie es einfach direkt indizieren können?