Какой способ лучше реализовать 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]}
за исключением того, что $#
это гарантированное безопасное значение. зачем копировать весь набор, а затем уничтожать его, когда вы можете просто индексировать его напрямую?