มีวิธีเปลี่ยนอาร์กิวเมนต์บรรทัดคำสั่งในสคริปต์ 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
ฉันหวังว่านี่จะเป็นประโยชน์สำหรับคนอื่น