มีวิธีเปลี่ยนอาร์กิวเมนต์บรรทัดคำสั่งในสคริปต์ Bash หรือไม่? ตัวอย่างเช่นสคริปต์ Bash ถูกเรียกเช่นนี้:
./foo arg1 arg2
มีวิธีเปลี่ยนค่าของ arg1 ภายในสคริปต์หรือไม่? สิ่งที่ต้องการ:
$1="chintz"
มีวิธีเปลี่ยนอาร์กิวเมนต์บรรทัดคำสั่งในสคริปต์ Bash หรือไม่? ตัวอย่างเช่นสคริปต์ Bash ถูกเรียกเช่นนี้:
./foo arg1 arg2
มีวิธีเปลี่ยนค่าของ arg1 ภายในสคริปต์หรือไม่? สิ่งที่ต้องการ:
$1="chintz"
คำตอบ:
คุณต้องรีเซ็ตอาร์กิวเมนต์ทั้งหมด ในการเปลี่ยนแปลงเช่น$3:
$ set -- "${@:1:2}" "new" "${@:4}"
โดยพื้นฐานแล้วคุณตั้งค่า อาร์กิวเมนต์ทั้งหมดเป็นค่าปัจจุบันยกเว้นอาร์กิวเมนต์ที่คุณต้องการเปลี่ยนแปลง set --นอกจากนี้ยังมีการระบุโดย POSIX 7
"${@:1:2}"สัญกรณ์มีการขยายไปยังสอง (เพราะฉะนั้น2ในสัญกรณ์) ข้อโต้แย้งตำแหน่งเริ่มต้นจากการชดเชย1(คือ$1) มันเป็นชื่อย่อสำหรับ"$1" "$2"ในกรณีนี้ "${17}"แต่มันเป็นประโยชน์มากขึ้นเมื่อคุณต้องการที่จะเปลี่ยนเช่น
evalที่ด้านหน้าของสายต่อที่นี้
การเพิ่มประสิทธิภาพเพื่อความชัดเจนและความสามารถในการบำรุงรักษาคุณอาจจะดีกว่าในการกำหนด$1และ$2ให้กับตัวแปรที่มีความหมายมากขึ้น (ฉันไม่รู้input_filename = $1และoutput_filename = $2หรือบางอย่าง) จากนั้นเขียนทับตัวแปรเหล่านั้น ( input_filename = 'chintz') โดยปล่อยให้อินพุตไปยังสคริปต์ไม่เปลี่ยนแปลงในกรณีที่เป็น ต้องการที่อื่น
ฉันรู้ว่านี่เป็นเรื่องเก่า แต่ฉันพบว่าคำตอบของthkalaมีประโยชน์มากดังนั้นฉันจึงใช้ความคิดและขยายความเล็กน้อยเพื่อให้ฉันสามารถเพิ่มค่าเริ่มต้นสำหรับอาร์กิวเมนต์ใด ๆ ที่ยังไม่ได้กำหนด - ตัวอย่างเช่น:
# set defaults for the passed arguments (if any) if not defined.
#
arg1=${1:-"default-for-arg-1"}
arg2=${2:-"default-for-arg-2"}
set -- "${arg1}" "${arg2}"
unset arg1 arg2
ฉันหวังว่านี่จะเป็นประโยชน์สำหรับคนอื่น