Seperti yang telah dijawab, cara yang lebih portabel untuk menggunakan variabel adalah dengan mengutipnya:
$ 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$
Ada perbedaan implementasi dalam bash, dengan baris:
l="$(printf '%s\t%s\t%s\n' foo bar baz)"; <<<$l sed -n l
Ini adalah hasil dari sebagian besar cangkang:
/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$
Hanya bash pisahkan variabel di sebelah kanan <<<
saat tidak dikutip.
Namun, yang telah diperbaiki pada versi bash 4.4
Itu berarti bahwa nilai $IFS
mempengaruhi hasil <<<
.
Dengan garis:
l=(1 2 3); IFS=:; sed -n l <<<"${l[*]}"
Semua shell menggunakan karakter pertama IFS untuk menggabungkan nilai.
/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$
Dengan "${l[@]}"
, ruang diperlukan untuk memisahkan argumen yang berbeda, tetapi beberapa shell memilih untuk menggunakan nilai dari IFS (Apakah itu benar?).
/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$
Dengan IFS nol, nilai-nilai harus bergabung, seperti dengan baris ini:
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$
Tetapi baik lksh dan mksh gagal melakukannya.
Jika kami mengubah ke daftar argumen:
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$
Baik yash dan zsh gagal memisahkan argumen. Apakah itu bug?
echo -e 'foo\tbar\tbaz\n...'
,echo $'foo\tbar\tbaz\n...'
, atauprintf 'foo\tbar\tbaz\n...\n'
atau variasi dari ini. Ini menyelamatkan Anda dari keharusan untuk secara individual membungkus setiap tab atau baris baru.