ฉันกำลังเขียนสคริปต์ bash ซึ่งมีset -u
และฉันมีปัญหากับการขยายอาร์เรย์ที่ว่างเปล่า: bash ดูเหมือนจะถือว่าอาร์เรย์ว่างเป็นตัวแปรที่ไม่ได้ตั้งค่าระหว่างการขยาย:
$ set -u
$ arr=()
$ echo "foo: '${arr[@]}'"
bash: arr[@]: unbound variable
( declare -a arr
ไม่ช่วยเช่นกัน)
วิธีแก้ปัญหาทั่วไปสำหรับสิ่งนี้คือการใช้${arr[@]-}
แทนดังนั้นการแทนที่สตริงว่างแทนที่จะเป็นอาร์เรย์ว่าง ("ไม่ได้กำหนด") อย่างไรก็ตามนี่ไม่ใช่วิธีแก้ปัญหาที่ดีเนื่องจากตอนนี้คุณไม่สามารถแยกแยะระหว่างอาร์เรย์ที่มีสตริงว่างเดียวกับอาร์เรย์ว่างได้ (@ - การขยายเป็นพิเศษในการทุบตีมันขยายออก"${arr[@]}"
ไป"${arr[0]}" "${arr[1]}" …
ซึ่งทำให้เป็นเครื่องมือที่สมบูรณ์แบบสำหรับการสร้างบรรทัดคำสั่ง)
$ countArgs() { echo $#; }
$ countArgs a b c
3
$ countArgs
0
$ countArgs ""
1
$ brr=("")
$ countArgs "${brr[@]}"
1
$ countArgs "${arr[@]-}"
1
$ countArgs "${arr[@]}"
bash: arr[@]: unbound variable
$ set +u
$ countArgs "${arr[@]}"
0
ดังนั้นมีวิธีแก้ปัญหานั้นไหมนอกเหนือจากการตรวจสอบความยาวของอาร์เรย์ในif
(ดูตัวอย่างโค้ดด้านล่าง) หรือปิด-u
การตั้งค่าสำหรับส่วนสั้น ๆ นั้น?
if [ "${#arr[@]}" = 0 ]; then
veryLongCommandLine
else
veryLongCommandLine "${arr[@]}"
fi
อัปเดต:bugs
แท็กถูกลบเนื่องจากคำอธิบายของ ikegami
"${arr[@]}"
ฉันไม่เห็นคุณทดสอบ ฉันพลาดอะไรไปรึเปล่า? จากสิ่งที่ฉันเห็นมันใช้งานได้อย่างน้อยใน5.x
.