web-dev-qa-db-fra.com

Caractères de tabulation d'écho dans le script bash

Comment faire écho à un ou plusieurs caractères de tabulation à l'aide d'un script bash? Quand j'exécute ce code

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

J'ai compris

res=[ x] # that is [<space>x]
236
kalyanji
echo -e ' \t '

echo 'espace onglet espace nouvelle ligne' (-e signifie 'activer l'interprétation des échappements de barre oblique inverse'):

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

Utilisez printf, pas echo.

Il existe plusieurs versions différentes de la commande echo. Il existe /bin/echo (qui peut ou non correspondre à la version GNU de Coreutils, en fonction du système), et la commande echo est intégrée à la plupart des interpréteurs. Différentes versions ont différentes manières (ou aucun moyen) de spécifier ou de désactiver les caractères d'échappement pour les caractères de contrôle.

printf, en revanche, a beaucoup moins de variation. Il peut exister en tant que commande, typiquement /bin/printf, et il est intégré à certains shells (bash et zsh l'ont, tcsh et ksh n'en ont pas), mais les différentes versions sont beaucoup plus similaires les unes aux autres que les différentes versions de echo Et vous ne devez pas vous souvenir des options de ligne de commande (à quelques exceptions près; GNU Coreutils printf accepte --version et --help, et l’imprimante bash intégrée accepte -v var pour stocker le résultat 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 dont vous parlez; il vous suffit de mettre des guillemets doubles autour de l'argument:

echo "[$res]"

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

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

n'est pas avec echo; c'est que le shell a remplacé l'onglet par un espace avant que echo ne l'ait jamais vue.

echo convient pour une sortie simple, telle que echo hello world, mais vous devez utiliser printf chaque fois que vous souhaitez effectuer quelque chose de plus complexe. Vous pouvez obtenir echo au travail, mais le code résultant risque d’échouer si vous l’exécutez avec une autre implémentation echo ou un autre Shell.

61
Keith Thompson

Mettez votre chaîne entre double quotes:

echo "[$res]"
31
kmkaplan

Vous pouvez aussi essayer:

echo Hello$'\t'world.
25
jbatista

vous devez utiliser le drapeau -e pour l'écho, alors vous pouvez 

echo -e "\t\t x"
17
Learning

Utiliser echo pour imprimer les valeurs des variables est un piège courant de Bash . Lien de référence:

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

11
Anonymous

De la page de manuel de bash:

Les mots de la forme $ 'chaîne' sont traités spécialement. Word se développe en chaîne, avec les caractères d'échappement avec une barre oblique inversée remplacés comme spécifié par la norme ANSI C.

Donc, vous pouvez faire ceci:

echo $'hello\tworld'
11
esoriano

Utilisez la frappe textuelle, ^V (CTRL+V, C-v, peu importe).

Lorsque vous tapez ^V dans le terminal (ou dans la plupart des éditeurs Unix), le caractère suivant est pris mot à mot. Vous pouvez utiliser ceci pour taper un caractère de tabulation littéral à l'intérieur d'une chaîne en écho.

Quelque chose comme les œuvres suivantes:

echo "^V<tab>"     # CTRL+V, TAB

Documents Bash (q.v., "quoted-insert")

quoted-insert (C-q, C-v) Ajoutez le prochain caractère que vous tapez à la ligne mot à mot. Voici comment insérer des séquences de touches telles que C-q, par exemple.

note latérale: selon ceciALT+TABdevrait faire la même chose, mais nous avons tous lié cette séquence au changement de fenêtre, nous ne pouvons donc pas l'utiliser

tabulation insérée (M-TAB) Insérer un caractère de tabulation.

-

Remarque: vous pouvez utiliser cette stratégie avec toutes sortes de caractères inhabituels. Comme un retour de voiture:

echo "^V^M"        # CTRL+V, CTRL+M

Cela est dû au fait que le retour à la ligne est ASCII 13 et que M est la 13ème lettre de l'alphabet. Ainsi, lorsque vous tapez ^M, vous obtenez le 13ème caractère ASCII. Vous pouvez le voir en action à l'aide de ls^M, dans une invite vide, qui insérera un retour à la ligne, faisant que l'invite se comportera comme si vous aviez appuyé sur return. Lorsque ces caractères sont normalement interprétés, verbatim vous obtient le caractère littéral.

7
rich remer

Si vous souhaitez utiliser echo "a\tb" dans un script, exécutez-le en tant que:

# sh -e myscript.sh

Alternativement, vous pouvez donner à myscript.sh l'autorisation d'exécution, puis exécuter le script.

# chmod +x myscript.sh
# ./myscript.sh
2
ATC
res="\t\tx"
echo -e "[${res}]"
0
yanghaogn