Какой способ лучше реализовать print_last_arg?
#!/bin/sh
print_last_arg () {
eval "echo \${$#}" # this hurts
}
print_last_arg foo bar baz
# baz
(Если бы это было, скажем, #!/usr/bin/zshвместо того, #!/bin/shчтобы знать, что делать. Моя проблема - найти разумный способ реализовать это #!/bin/sh.)
РЕДАКТИРОВАТЬ: выше, это только глупый пример. Моя цель не в том, чтобы напечатать последний аргумент, а в том, чтобы иметь возможность ссылаться на последний аргумент в функции оболочки.
EDIT2: я прошу прощения за такой неясный вопрос. Я надеюсь сделать это правильно на этот раз.
Если бы это было /bin/zshвместо /bin/sh, я мог бы написать что-то вроде этого
#!/bin/zsh
print_last_arg () {
local last_arg=$argv[$#]
echo $last_arg
}
Выражение $argv[$#]является примером того, что я описал в своем первом EDIT как способ ссылки на последний аргумент в функции оболочки .
Поэтому я действительно должен был написать свой оригинальный пример так:
print_last_arg () {
local last_arg=$(eval "echo \${$#}") # but this hurts even more
echo $last_arg
}
... чтобы было ясно, что то, что я ищу, - это менее ужасная вещь, которую можно поставить справа от задания.
Однако обратите внимание, что во всех примерах к последнему аргументу обращаются неразрушающим образом . Таким образом, доступ к последнему аргументу оставляет позиционные аргументы в целом без изменений.
var=$( eval echo \${$#})к eval var=\${$#}- два не похожи.
shiftи set -- ...основанные решения могут быть разрушительными, если они не используются в функциях, где они также безвредны.
eval "var=\${$#}"по сравнению с тем, var=${arr[evaled index]}за исключением того, что $#это гарантированное безопасное значение. зачем копировать весь набор, а затем уничтожать его, когда вы можете просто индексировать его напрямую?