Réponses:
echo -e ' \t '
fera écho à «new tab space space» ( -esignifie «permettre l'interprétation des échappements antislash»):
$ echo -e ' \t ' | hexdump -C
00000000 20 09 20 0a | . .|
echo -ene fonctionne pas à partir de Makefiles?
echo -en'est pas POSIX et les makeappels /bin/shqui ne sont normalement pas utilisés de manière interactive par le programme et qui ne sont normalement pas -eimplémentés. Pour la portabilité, utilisez printf '\t'plutôt.
manpage de la echocommande ne mentionne pas l'option -e. Cependant, cette option est acceptée.
Utilisez printfpas echo.
Il existe plusieurs versions différentes de la echocommande. Il y en a /bin/echo(qui peut être ou non la version GNU Coreutils, selon le système), et la echocommande 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 --versionet --help, et le bash printf intégré accepte -v varde 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 echocela 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 echovoir.
echoest bien pour une sortie simple, comme echo hello world, mais vous devez utiliser printfchaque fois que vous voulez faire quelque chose de plus complexe. Vous pouvez vous mettre echoau travail, mais le code résultant est susceptible d'échouer lorsque vous l'exécutez avec une echoimplé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 ^Vdans 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.
greppour attraper des lignes contenant des tabcaractères.
L'utilisation de l'écho pour imprimer les valeurs des variables est un piège Bash courant. Lien de référence: