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]
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 | . .|
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.
Mettez votre chaîne entre double quotes:
echo "[$res]"
Vous pouvez aussi essayer:
echo Hello$'\t'world.
vous devez utiliser le drapeau -e pour l'écho, alors vous pouvez
echo -e "\t\t x"
Utiliser echo pour imprimer les valeurs des variables est un piège courant de Bash . Lien de référence:
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'
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+TAB
devrait 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.
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
res="\t\tx"
echo -e "[${res}]"