구현하는 더 좋은 방법은 무엇입니까 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]}
제외하고 비교할 때 크게 다른 점은 없습니다 $#
. 왜 전체 집합을 복사 한 다음 직접 색인을 생성 할 수있을 때 파괴합니까?