Réponses:
echo -e ' \t '
fera écho à «new tab space space» ( -e
signifie «permettre l'interprétation des échappements antislash»):
$ echo -e ' \t ' | hexdump -C
00000000 20 09 20 0a | . .|
echo -e
ne fonctionne pas à partir de Makefiles?
echo -e
n'est pas POSIX et les make
appels /bin/sh
qui ne sont normalement pas utilisés de manière interactive par le programme et qui ne sont normalement pas -e
implémentés. Pour la portabilité, utilisez printf '\t'
plutôt.
man
page de la echo
commande ne mentionne pas l'option -e
. Cependant, cette option est acceptée.
Utilisez printf
pas echo
.
Il existe plusieurs versions différentes de la echo
commande. Il y en a /bin/echo
(qui peut être ou non la version GNU Coreutils, selon le système), et la echo
commande est intégrée dans la plupart des shells. Différentes versions ont différentes manières (ou aucune manière) de spécifier ou de désactiver les échappements pour les caractères de contrôle.
printf
, d'autre part, a beaucoup moins de variation. Il peut exister en tant que commande, généralement /bin/printf
, et il est intégré à certains shells (bash et zsh l'ont, tcsh et ksh ne le font pas), mais les différentes versions sont beaucoup plus similaires les unes aux autres que les différentes versions de echo
. Et vous n'avez pas à vous souvenir des options de ligne de commande (à quelques exceptions près; GNU Coreutils printf accepte --version
et --help
, et le bash printf intégré accepte -v var
de 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
cela fonctionnera aussi bien pour l'exemple dont vous parlez; il vous suffit de 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 vos commandes d'origine:
res=' 'x # res = "\t\tx"
echo '['$res']' # expect [\t\tx]
n'est pas avec echo
; c'est que la coquille a remplacé la languette par un espace avant de la echo
voir.
echo
est bien pour une sortie simple, comme echo hello world
, mais vous devez utiliser printf
chaque fois que vous voulez faire quelque chose de plus complexe. Vous pouvez vous mettre echo
au travail, mais le code résultant est susceptible d'échouer lorsque vous l'exécutez avec une echo
implémentation différente ou un shell différent.
Vous pouvez également essayer:
echo Hello$'\t'world.
vous devez utiliser le drapeau -e pour l'écho, vous pouvez
echo -e "\t\t x"
Depuis la page de manuel de bash:
Les mots de la forme $ 'string' sont traités spécialement. Le mot se développe en chaîne, avec des caractères d'échappement antislash remplacés comme spécifié par la norme C ANSI.
Vous pouvez donc faire ceci:
echo $'hello\tworld'
Utilisez la combinaison de touches mot pour mot, ^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 repris mot pour mot . Vous pouvez l'utiliser pour taper un caractère de tabulation littéral dans une chaîne que vous faites écho.
Quelque chose comme les œuvres suivantes:
echo "^V<tab>" # CTRL+V, TAB
Bash docs ( qv , "quoted-insert")
quoted-insert (Cq, Cv) Ajoutez le caractère suivant que vous tapez à la ligne mot pour mot. Voici comment insérer des séquences de touches comme Cq, par exemple.
note de côté: selon cela, ALT+TAB
devrait faire la même chose, mais nous avons tous lié cette séquence à la commutation de fenêtre afin que nous ne puissions pas l'utiliser
tab-insert (M-TAB) Insère un caractère de tabulation.
-
Remarque: vous pouvez utiliser cette stratégie avec toutes sortes de personnages inhabituels. Comme un retour chariot:
echo "^V^M" # CTRL+V, CTRL+M
En effet, le retour chariot est ASCII 13 et M est la 13e lettre de l'alphabet, donc lorsque vous tapez ^M
, vous obtenez le 13e caractère ASCII. Vous pouvez le voir en action en utilisant ls^M
, à une invite vide, qui insérera un retour chariot, provoquant l'invite à agir exactement comme vous appuyez sur retour. Lorsque ces caractères sont normalement interprétés, textuellement vous obtenez le caractère littéral.
grep
pour attraper des lignes contenant des tab
caractères.
L'utilisation de l'écho pour imprimer les valeurs des variables est un piège Bash courant. Lien de référence: