เป็นวิธีที่ดีกว่าในการใช้งาน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[$#]
เป็นตัวอย่างของสิ่งที่ผมอธิบายไว้ในแก้ไขครั้งแรกของฉันในฐานะที่เป็นวิธีการที่จะอ้างถึงอาร์กิวเมนต์สุดท้ายภายในฟังก์ชั่นเชลล์
ดังนั้นฉันควรเขียนตัวอย่างดั้งเดิมของฉันเช่นนี้:
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]}
ยกเว้นว่า$#
เป็นค่าที่ปลอดภัยรับประกัน ทำไมคัดลอกทั้งชุดแล้วทำลายมันเมื่อคุณสามารถสร้างดัชนีได้โดยตรง