Cách tốt hơn để thực hiện là print_last_arg
gì?
#!/bin/sh
print_last_arg () {
eval "echo \${$#}" # this hurts
}
print_last_arg foo bar baz
# baz
(Nếu điều này là, giả sử, #!/usr/bin/zsh
thay vì #!/bin/sh
tôi biết phải làm gì. Vấn đề của tôi là tìm một cách hợp lý để thực hiện việc này #!/bin/sh
.)
EDIT: Trên đây chỉ là một ví dụ ngớ ngẩn. Mục tiêu của tôi không phải là in đối số cuối cùng, mà là có một cách để tham chiếu đến đối số cuối cùng trong hàm shell.
EDIT2: Tôi xin lỗi vì một câu hỏi không rõ ràng như vậy. Tôi hy vọng sẽ có được nó ngay lúc này.
Nếu đây là /bin/zsh
thay vì /bin/sh
, tôi có thể viết một cái gì đó như thế này
#!/bin/zsh
print_last_arg () {
local last_arg=$argv[$#]
echo $last_arg
}
Biểu thức $argv[$#]
là một ví dụ về những gì tôi đã mô tả trong EDIT đầu tiên của mình như một cách để tham chiếu đến đối số cuối cùng trong hàm shell .
Vì vậy, tôi thực sự nên viết ví dụ ban đầu của mình như thế này:
print_last_arg () {
local last_arg=$(eval "echo \${$#}") # but this hurts even more
echo $last_arg
}
... Để làm rõ rằng những gì tôi theo đuổi là một điều ít tệ hại hơn để đặt bên phải của nhiệm vụ.
Tuy nhiên, lưu ý rằng trong tất cả các ví dụ, đối số cuối cùng được truy cập không mang tính hủy diệt . IOW, việc truy cập của đối số cuối cùng khiến cho các đối số vị trí không bị ảnh hưởng.
var=$( eval echo \${$#})
để eval var=\${$#}
- hai là không có gì giống nhau.
shift
và set -- ...
dựa trên có thể bị phá hủy trừ khi được sử dụng trong các chức năng nơi chúng cũng vô hại.
eval "var=\${$#}"
khi làm so với var=${arr[evaled index]}
ngoại trừ đó $#
là một giá trị an toàn được đảm bảo. Tại sao sao chép toàn bộ sau đó hủy nó khi bạn có thể lập chỉ mục trực tiếp?