ดังที่ได้รับการตอบแล้ววิธีพกพาที่จะใช้ตัวแปรคือการอ้างอิงมัน:
$ printf '%s\t%s\t%s\n' foo bar baz
foo bar baz
$ l="$(printf '%s\t%s\t%s\n' foo bar baz)"
$ <<<$l sed -n l
foo bar baz$
$ <<<"$l" sed -n l
foo\tbar\tbaz$
มีความแตกต่างของการใช้งานในทุบตีกับสาย:
l="$(printf '%s\t%s\t%s\n' foo bar baz)"; <<<$l sed -n l
นี่คือผลลัพธ์ของเชลล์ส่วนใหญ่:
/bin/sh : foo bar baz$
/bin/b43sh : foo bar baz$
/bin/bash : foo bar baz$
/bin/b44sh : foo\tbar\tbaz$
/bin/y2sh : foo\tbar\tbaz$
/bin/ksh : foo\tbar\tbaz$
/bin/ksh93 : foo\tbar\tbaz$
/bin/lksh : foo\tbar\tbaz$
/bin/mksh : foo\tbar\tbaz$
/bin/mksh-static: foo\tbar\tbaz$
/usr/bin/ksh : foo\tbar\tbaz$
/bin/zsh : foo\tbar\tbaz$
/bin/zsh4 : foo\tbar\tbaz$
เฉพาะทุบตีแบ่งตัวแปรทางด้านขวาของ<<<
เมื่อไม่ได้ยกมา
แต่ที่ได้รับการแก้ไขในทุบตีรุ่น 4.4
นั่นหมายความว่าค่าของผลกระทบต่อผลการ$IFS
<<<
ด้วยสาย:
l=(1 2 3); IFS=:; sed -n l <<<"${l[*]}"
เชลล์ทั้งหมดใช้อักขระตัวแรกของ IFS เพื่อเข้าร่วมค่า
/bin/y2sh : 1:2:3$
/bin/sh : 1:2:3$
/bin/b43sh : 1:2:3$
/bin/b44sh : 1:2:3$
/bin/bash : 1:2:3$
/bin/ksh : 1:2:3$
/bin/ksh93 : 1:2:3$
/bin/lksh : 1:2:3$
/bin/mksh : 1:2:3$
/bin/zsh : 1:2:3$
/bin/zsh4 : 1:2:3$
ด้วย"${l[@]}"
ต้องการพื้นที่เพื่อแยกอาร์กิวเมนต์ที่แตกต่างกัน แต่เชลล์บางตัวเลือกที่จะใช้ค่าจาก IFS (ถูกต้องหรือไม่)
/bin/y2sh : 1:2:3$
/bin/sh : 1 2 3$
/bin/b43sh : 1 2 3$
/bin/b44sh : 1 2 3$
/bin/bash : 1 2 3$
/bin/ksh : 1 2 3$
/bin/ksh93 : 1 2 3$
/bin/lksh : 1:2:3$
/bin/mksh : 1:2:3$
/bin/zsh : 1:2:3$
/bin/zsh4 : 1:2:3$
ด้วย IFS ที่ว่างเปล่าค่าควรเข้าร่วมเช่นเดียวกับบรรทัดนี้:
a=(1 2 3); IFS=''; sed -n l <<<"${a[*]}"
/bin/y2sh : 123$
/bin/sh : 123$
/bin/b43sh : 123$
/bin/b44sh : 123$
/bin/bash : 123$
/bin/ksh : 123$
/bin/ksh93 : 123$
/bin/lksh : 1 2 3$
/bin/mksh : 1 2 3$
/bin/zsh : 123$
/bin/zsh4 : 123$
แต่ทั้ง lksh และ mksh ไม่สามารถทำได้
หากเราเปลี่ยนเป็นรายการข้อโต้แย้ง:
l=(1 2 3); IFS=''; sed -n l <<<"${l[@]}"
/bin/y2sh : 123$
/bin/sh : 1 2 3$
/bin/b43sh : 1 2 3$
/bin/b44sh : 1 2 3$
/bin/bash : 1 2 3$
/bin/ksh : 1 2 3$
/bin/ksh93 : 1 2 3$
/bin/lksh : 1 2 3$
/bin/mksh : 1 2 3$
/bin/zsh : 123$
/bin/zsh4 : 123$
yash และ zsh ไม่สามารถแยกอาร์กิวเมนต์ได้ นั่นเป็นข้อบกพร่องหรือไม่?
echo -e 'foo\tbar\tbaz\n...'
,echo $'foo\tbar\tbaz\n...'
หรือprintf 'foo\tbar\tbaz\n...\n'
หรือรูปแบบเหล่านี้ มันช่วยให้คุณไม่ต้องห่อแต่ละแท็บหรือขึ้นบรรทัดใหม่