การทดลองใช้และข้อผิดพลาดเป็นจำนวนมาก แต่ในที่สุดก็ใช้งานได้
ฉันได้แรงบันดาลใจจาก Youness แต่คำตอบอื่น ๆ ทั้งหมดไม่ได้ช่วยทุบตีเก่าของฉัน (suse11sp1 [3.2.51 (1) - ปล่อย]]
การวนรอบ 'for' ปฏิเสธที่จะขยายอาร์เรย์ทางอ้อมแทนคุณจำเป็นต้องขยายมันล่วงหน้าให้ใช้เพื่อสร้างอาร์เรย์ใหม่ที่มีชื่อตัวแปรใหม่ของคุณ ตัวอย่างด้านล่างของฉันแสดงการวนซ้ำสองเท่าซึ่งเป็นสิ่งที่ฉันตั้งใจจะใช้
THEBIGLOOP=(New_FOO New_BAR)
FOOthings=(1 2 3)
BARthings=(a b c)
for j in ${THEBIGLOOP[*]}
do
TheNewVariable=$(eval echo \${${j#New_}things[@]})
for i in $TheNewVariable
do
echo $j $i" hello"
echo
done
done
ฉันใช้ # เพื่อลบ "New_" จากรายการอาร์เรย์แรกจากนั้นต่อกับ "Things" เพื่อรับ "FOOthings" \ $ {} ด้วย echo และ eval จากนั้นทำสิ่งต่าง ๆ ตามลำดับโดยไม่ทิ้งข้อผิดพลาดซึ่งจะถูกพันด้วย $ () ใหม่และกำหนดชื่อตัวแปรใหม่
$ Test.sh
New_FOO 1 hello
New_FOO 2 hello
New_FOO 3 hello
New_BAR a hello
New_BAR b hello
New_BAR c hello
อัปเดต ##### 2018/06/07
ฉันเพิ่งค้นพบหมุนอีกหนึ่งเกี่ยวกับปัญหานี้ ตัวแปรที่สร้างขึ้นไม่ใช่อาร์เรย์ แต่เป็นสตริงที่คั่นด้วยช่องว่าง สำหรับงานด้านบนนี้ถือว่าใช้ได้เนื่องจากวิธี "สำหรับ" ทำงานมันไม่ได้อ่านอาเรย์นั้นจะถูกขยายและวนลูปผ่านดูที่ด้านล่างแยก:
for VARIABLE in 1 2 3 4 5 .. N
do
command1
command2
commandN
done
แต่ฉันต้องใช้มันเป็นอาร์เรย์ สำหรับเรื่องนี้ฉันต้องดำเนินการอีกขั้นตอนหนึ่ง ผมเอาคำต่อคำรหัสโดยเดนนิสวิลเลียมสัน ฉันทดสอบแล้วและใช้งานได้ดี
IFS=', ' read -r -a TheNewVariable <<< ${TheNewVariable[@]}
"IFS = ','" เป็นตัวแปรที่มีตัวกำหนดของคุณ "read" with "-a" จะตัดและฟีด sting กลับเข้าไปในตัวแปรอาร์เรย์ หมายเหตุนี่ไม่เกี่ยวกับเครื่องหมายอัญประกาศ แต่มีตัวเลือกสองสามตัวที่อ่านเพื่อจัดการสิ่งนี้เช่นฉันได้ลบแฟล็ก -r ซึ่งฉันไม่ต้องการ ดังนั้นตอนนี้ฉันได้รวมการเพิ่มเข้ามาในการสร้างตัวแปรซึ่งช่วยให้ข้อมูลได้รับการปฏิบัติและแก้ไขตามที่ควรจะเป็น
THEBIGLOOP=(New_FOO New_BAR)
FOOthings=(1 2 3)
BARthings=(a b c)
for j in ${THEBIGLOOP[*]}
do
IFS=', ' read -a TheNewVariable <<< $(eval echo \${${j#New_}things[@]})
for i in ${TheNewVariable[@]} #Now have to wrap with {} and expand with @
do
echo $j $i" hello"
echo ${TheNewVariable[$i]} #This would not work in the original code
echo
done
done