ฉันจะเชื่อมสตริงจากรายการในสคริปต์ทุบตีได้อย่างไร


5

ตัวอย่างเช่น:

List="A B C D"
for I in $List
do
    OUT=$OUT" -$I"
done

เมื่อฉันเรียกใช้ผลลัพธ์นี้คือ:

" -A -B -C -D"

แต่ต้องการเป็น:

"-A -B -C -D"

ฉันจะต่อกันได้โดยไม่ต้องนำหน้า?

btw นี้เป็นรายการอาร์กิวเมนต์ของสคริปต์

คำตอบ:


10

ใช้การขยายพารามิเตอร์ตามเงื่อนไข :

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")

0

คุณสามารถลบช่องว่างนำหน้าโดยใช้คำสั่งหลัง for-loop เช่น

OUT=${OUT# }

นำไปสู่

List="A B C D"
for I in $List
do
    OUT=$OUT" -$I"
done
OUT=${OUT# }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.