291 votes

Echo des caractères de tabulation dans bash script

Comment faire écho à un ou plusieurs caractères de tabulation en utilisant un script bash script ? Lorsque j'exécute ce code

res='       'x # res = "\t\tx"
echo '['$res']' # expect [\t\tx]

Je reçois ceci

res=[ x] # that is [<space>x]

496voto

Johannes Weiß Points 19013
echo -e ' \t '

fera écho à 'espace tabulation espace nouvelle ligne' ( -e signifie "activer l'interprétation des échappements de barres obliques inversées") :

$ echo -e ' \t ' | hexdump -C
00000000  20 09 20 0a                                       | . .|

73voto

Keith Thompson Points 85120

Utilisez printf pas echo .

Il existe plusieurs versions différentes du echo commande. Il y a /bin/echo (qui peut ou non être la version de GNU Coreutils, selon le système), et le fichier echo est intégrée à la plupart des shells. Les différentes versions ont des moyens différents (ou aucun moyen) de spécifier ou de désactiver l'échappement des caractères de contrôle.

printf En revanche, la variation est beaucoup moins importante. Il peut exister en tant que commande, typiquement /bin/printf et il est intégré dans certains shells (bash et zsh l'ont, tcsh et ksh ne l'ont pas), mais les différentes versions sont beaucoup plus similaires les unes aux autres que les différentes versions de echo sont. Et vous n'avez pas besoin de vous souvenir des options de la ligne de commande (à quelques exceptions près ; GNU Coreutils printf accepts --version y --help et le printf intégré de bash accepte -v var pour stocker la sortie dans une variable).

Pour votre exemple :

res='           'x # res = "\t\tx"
printf '%s\n' "[$res]"

Et maintenant il est temps pour moi d'admettre que echo fonctionnera tout aussi bien pour l'exemple que vous demandez ; vous devez simplement mettre des guillemets autour de l'argument :

echo "[$res]"

comme l'a écrit kmkaplan (il y a deux ans et demi, je viens de le remarquer !). Le problème avec tes commandes originales :

res='           'x # res = "\t\tx"
echo '['$res']' # expect [\t\tx]

n'est pas avec echo ; c'est que le shell a remplacé la tabulation par un espace avant echo jamais vu.

echo convient pour une sortie simple, comme echo hello world mais vous devriez utiliser printf quand vous voulez faire quelque chose de plus complexe. Vous peut obtenir echo pour fonctionner, mais le code résultant est susceptible d'échouer lorsque vous l'exécutez avec un autre type d'ordinateur. echo ou un shell différent.

33voto

kmkaplan Points 10338

Mettez votre chaîne entre double citations :

echo "[$res]"

31voto

jbatista Points 880

Vous pouvez également essayer :

echo Hello$'\t'world.

11voto

Anonymous Points 1568

L'utilisation d'echo pour imprimer les valeurs des variables est un piège commun de Bash. Lien de référence :

http://mywiki.wooledge.org/BashPitfalls#echo_.24foo

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X