web-dev-qa-db-fra.com

Comment puis-je faire écho à une chaîne avec plusieurs espaces dans bash "intacte"?

J'ai assigné un var comme ceci:

MYCUSTOMTAB='     '

Mais en l'utilisant en écho à la fois:

echo $MYCUSTOMTAB"blah blah"

ou

echo -e $MYCUSTOMTAB"blah blah"

renvoie juste un espace simple et le reste de la chaîne:

 blah blah

Comment puis-je imprimer la chaîne complète intacte? Je veux l'utiliser pour avoir un retrait personnalisé parce que \t est trop large à mon goût.

17
user3450548

Mettez votre variable entre guillemets pour éviter fractionnement de champ , qui a mangé vos espaces:

$ MYCUSTOMTAB='     '
$ echo "${MYCUSTOMTAB}blah blah"
     blah blah
25
cuonglm

Comme suggéré dans cette réponse la citation de la variable suffit.

La raison pour laquelle la citation est nécessaire dans votre cas est que sans elle bash applique l'opérateur split + glob à l'expansion de $MYCUSTOMTAB. La valeur par défaut de $IFS contient le caractère TAB, donc dans echo -e $MYCUSTOMTAB"blah blah", $MYCUSTOMTAB est simplement divisé en rien, il devient le même que si vous aviez écrit:

echo -e "blah blah"

(vous ne voulez probablement pas -e ici btw).

Vous pouvez également utiliser printf au lieu de echo:

printf '%s\n' "$MYCUSTOMTAB"

printf '%s\n' "${MYCUSTOMTAB}blah blah"

Ou si vous voulez que printf fasse le même genre de \n, \t extensions qui echo -e le fait, utilisez %b au lieu de %s:

printf '%b\n' "${MYCUSTOMTAB}blah blah"

Pour référence, lisez Pourquoi printf est-il meilleur que echo?

9
techraf

Je pense qu'il suffit d'utiliser des guillemets doubles pour votre variable

echo -e "$MYCUSTOMTAB"."blah blah"
2
mnille

Je sais que votre question est taguée bash mais de toute façon, pour une portabilité et une fiabilité maximales, j'utiliserais:

printf "%sblah blah\n" "$MYCUSTOMTAB" 

ou

someString="blah blah"
printf "%s%s\n" "$MYCUSTOMTAB" "$someString"
1
jlliagre