ตัวอย่างเช่น:
List="A B C D"
for I in $List
do
OUT=$OUT" -$I"
done
เมื่อฉันเรียกใช้ผลลัพธ์นี้คือ:
" -A -B -C -D"
แต่ต้องการเป็น:
"-A -B -C -D"
ฉันจะต่อกันได้โดยไม่ต้องนำหน้า?
btw นี้เป็นรายการอาร์กิวเมนต์ของสคริปต์
ตัวอย่างเช่น:
List="A B C D"
for I in $List
do
OUT=$OUT" -$I"
done
เมื่อฉันเรียกใช้ผลลัพธ์นี้คือ:
" -A -B -C -D"
แต่ต้องการเป็น:
"-A -B -C -D"
ฉันจะต่อกันได้โดยไม่ต้องนำหน้า?
btw นี้เป็นรายการอาร์กิวเมนต์ของสคริปต์
คำตอบ:
ใช้การขยายพารามิเตอร์ตามเงื่อนไข :
List="A B C D"
for I in $List
do
OUT=${OUT:+$OUT }-$I
done
นิพจน์${OUT:+$OUT }
จะขยายออกเป็นไม่มีอะไรถ้า OUT ไม่ได้ตั้งค่าหรือว่างเปล่า ถ้ามันถูกตั้งค่าเป็นบางสิ่งบางอย่างมันจะขยายไปยังสิ่งนั้นตามด้วยช่องว่าง
อย่างไรก็ตามการดำเนินการเช่นนี้ - การจัดการกับสตริงที่คั่นด้วยช่องว่างเป็นรายการ - เต็มไปด้วยปัญหาที่เป็นไปได้: quoting, ค่าที่มีการเว้นวรรคโดยไม่คาดคิด ฯลฯ คุณควรใช้อาร์เรย์:
List=(A B C D)
for I in "${List[@]}"
do
OUT=${OUT:+$OUT }-$I
done
ขึ้นอยู่กับสิ่งที่คุณทำด้วย$OUT
อาจทำให้รู้สึกเป็นอาเรย์เช่นกัน:
List=(A B C D)
OUT=()
for I in "${List[@]}"; do
OUT+=("-$I")
done
จากนั้นคุณจะใช้"${OUT[@]}"
เพื่อส่งผ่านองค์ประกอบของอาร์เรย์ไปยังคำสั่งอื่นเป็นข้อโต้แย้งแยก
หากต้องการกลับไปใช้เวอร์ชันดั้งเดิมของคุณในกรณีนี้คุณสามารถใช้sed
และข้าม bash loop ทั้งหมดได้:
OUT=$(sed -E 's/^| /&-/g' <<<"$List")
คุณสามารถลบช่องว่างนำหน้าโดยใช้คำสั่งหลัง for-loop เช่น
OUT=${OUT# }
นำไปสู่
List="A B C D"
for I in $List
do
OUT=$OUT" -$I"
done
OUT=${OUT# }