Comme il a déjà été répondu, une façon plus portable d'utiliser une variable est de la citer:
$ 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$
Il y a une différence d'implémentation en bash, avec la ligne:
l="$(printf '%s\t%s\t%s\n' foo bar baz)"; <<<$l sed -n l
C'est le résultat de la plupart des obus:
/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$
Seul bash divise la variable à droite de <<<
lorsqu'elle n'est pas citée.
Cependant, cela a été corrigé dans la version 4.4 de bash.
Cela signifie que la valeur de $IFS
affecte le résultat de <<<
.
Avec la ligne:
l=(1 2 3); IFS=:; sed -n l <<<"${l[*]}"
Tous les shells utilisent le premier caractère d'IFS pour joindre des valeurs.
/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$
Avec "${l[@]}"
, un espace est nécessaire pour séparer les différents arguments, mais certains shells choisissent d'utiliser la valeur d'IFS (est-ce correct?).
/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$
Avec un IFS nul, les valeurs doivent devenir jointes, comme avec cette ligne:
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$
Mais lksh et mksh n'y parviennent pas.
Si nous passons à une liste d'arguments:
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 et zsh ne parviennent pas à séparer les arguments. Est-ce un bug?
echo -e 'foo\tbar\tbaz\n...'
,echo $'foo\tbar\tbaz\n...'
ouprintf 'foo\tbar\tbaz\n...\n'
ou des variations de ceux - ci. Cela vous évite d'avoir à envelopper individuellement chaque onglet ou nouvelle ligne.