ในการวนซ้ำอาร์เรย์ให้เพิ่มองค์ประกอบลงในอาร์เรย์


9

ฉันมีปัญหากับการวนซ้ำในทุบตี ตัวอย่าง: ("etc" "bin" "var")ฉันมีอาร์เรย์ และฉันทำซ้ำในอาร์เรย์นี้ แต่ในลูปฉันต้องการผนวกค่าลงในอาร์เรย์ เช่น

array=("etc" "bin" "var")
for i in "${array[@]}"
do
echo $i
done

นี้จะแสดงetc bin var(แน่นอนในบรรทัดที่แยกต่างหาก) และถ้าฉันผนวกหลังจากdoนั้น:

array=("etc" "bin" "var")
for i in "${array[@]}"
do
array+=("sbin")
echo $i
done

ฉันต้องการ: etc bin var sbin(แน่นอนในบรรทัดที่แยกต่างหาก)

สิ่งนี้ไม่ทำงาน ฉันจะทำมันได้อย่างไร


1
การเปลี่ยนแปลงสิ่งที่คุณทำซ้ำนั้นเป็นเรื่องที่มีความเสี่ยงเสมอ ก็มักจะเป็นเวลาที่ดีที่จะกลับขั้นตอนและพิจารณาว่ามีวิธีการอื่นที่อาจทำให้รู้สึก
เอริค Renouf

คำตอบ:


6

มันจะผนวก "sbin" 3 ครั้งตามที่ควร แต่จะไม่ซ้ำกับ "sbin" ที่เพิ่มใหม่ในลูปเดียวกัน

หลังจากตัวอย่างที่ 2:

echo "${array[@]}"
#=> etc bin var sbin sbin sbin

ใช่ครับถูกต้อง แต่ผมจำเป็นต้องเพิ่มวงเดียวกัน :)
damekr

ใช้สองforลูปแล้ว ขั้นแรกให้เพิ่มการเพิ่มของคุณจากนั้นวนซ้ำผลลัพธ์
PSkocik

1
ฉันไม่เห็นว่าทำไมคุณต้องการผนวก sbin ในลูป ผนวกเข้าด้วยกันเพียงครั้งเดียวทำให้รู้สึกมากขึ้น:array+=(sbin); for i in ...
PSkocik

เพราะในลูปฉันต้องตรวจสอบว่าไฟล์บางไฟล์ที่คัดลอกโดยลูปนี้มีเนื้อหาบางส่วนหรือไม่
damekr

5
set etc bin var
while [ "$#" -gt 1 ]
do    [ "$1" = bin ] &&
      set "$@" sbin
      printf %s\\n "$1"
shift;done 

ที่จะวนซ้ำในรายการของคุณ, ตะปูหัวsbinท้ายรายการดังกล่าวตามเงื่อนไข, และรวมsbinไว้ในเนื้อหา iterable

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.