Який кращий спосіб здійснити 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.)
EDIT: Наведене - лише дурний приклад. Моя мета - не надрукувати останній аргумент, а скоріше мати спосіб посилання на останній аргумент у функції оболонки.
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
}
... щоб зрозуміти, що те, що я переживаю, - це менш жахлива річ, яку слід ставити праворуч від завдання.
Однак зауважте, що у всіх прикладах до останнього аргументу звертаються неруйнівно . IOW, доступ до останнього аргументу залишає позиційні аргументи в цілому без змін.
var=$( eval echo \${$#})до них eval var=\${$#}- двоє нічим не схожі.
shiftі на set -- ...основі рішення можуть бути руйнівними , якщо не використовується у функціях , де вони нешкідливі теж.
eval "var=\${$#}"в порівнянні з за var=${arr[evaled index]}виключення того, що $#є гарантованим безпечним значенням. навіщо копіювати весь набір, а потім знищувати його, коли ви могли просто індексувати його безпосередньо?