2009-02-08 10 views

Répondre

322
echo -e ' \t ' 

se fera l'écho (-e signifie 'permettre l'interprétation des antislash échappe') 'onglet space newline':

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

Merci Johannes. Vous m'avez aidé à trouver cette solution: res = '\ t \ t'x; echo -e '[' $ res ']' – kalyanji

+1

Savez-vous pourquoi, echo -e' ne fonctionne pas depuis Makefiles? –

+18

C'est parce que 'echo -e' n'est pas POSIX et' make' appelle '/ bin/sh' qui n'est normalement pas utilisé par le programme de manière interactive, et qui normalement n'a pas' -e' implémenté. Pour la portabilité, utilisez 'printf '\ t' à la place. –

14

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

echo -e "\t\t x" 
28

Mettez votre chaîne entre doubles citations:

echo "[$res]" 
+3

La réponse simple et évidente - devrait être la acceptée. –

+6

Non, ne fonctionne pas. – Noldorin

+0

@Noldorin Que voulez-vous dire? Bien sûr que oui. – kmkaplan

11

En utilisant l'écho d'imprimer les valeurs des variables est un piège Bash commun. lien de référence:

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

+0

Cool, j'aime les "BashPitfalls", un grand morceau de matériel et soulager beaucoup de douleur de mon travail quotidien! –

+0

le lien a été changé en http://mywiki.wooledge.org/BashPitfalls/ – BiGYaN

+0

+1 parce que c'est tellement vrai. Mais notez que la chaîne kalyanji commence par un "[" et ne contient aucun "\". – kmkaplan

20

Vous pouvez aussi essayer:

echo Hello$'\t'world. 
+2

+1 pour une solution plus générale. J'utilise bash depuis des années et je viens d'apprendre ça maintenant! –

+0

C'est une réponse beaucoup plus générale que la réponse acceptée car elle peut être utilisée sans écho. – jwan

2

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

# 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 
48

Utilisez printf, non echo.

Il existe plusieurs versions différentes de la commande echo. Il y a /bin/echo (qui peut ou peut ne pas être la version de GNU Coreutils, selon le système), et la commande echo est intégrée dans la plupart des shells. Différentes versions ont différentes façons (ou pas du tout) 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 comme une commande, généralement /bin/printf, et il est construit dans 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 besoin de mémoriser les options de la ligne de commande (à quelques exceptions près, GNU Coreutils printf accepte --version et --help, et le bash printf intégré 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 vous posez au sujet; il vous suffit de mettre des guillemets doubles autour de l'argument:

echo "[$res]" 

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

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

est pas echo; c'est que la coquille a remplacé la languette par un espace avant que le echo ne l'ait jamais vu.

echo est bien pour la sortie simple, comme echo hello world, mais vous devez utiliser printf lorsque 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 exécutez avec une implémentation echo différente ou un autre shell.

+1

J'ai aimé celui-ci, il me permet d'utiliser la connaissance de printf et tous les prescripteurs de format. – Arun

+0

Je souhaite que ce soit plus optimisé! –

+0

@JezenThomas: Il n'est pas plus upvoted car il répond à la question d'une autre manière que demandé. La question mentionne spécifiquement l'écho, et l'écho n'est pas un verbe mais une commande. –

7

Sur la page man bash:

mots de la forme $ 'chaîne' sont traités spécialement. Le mot se développe en chaîne, avec des caractères d'échappement à barre oblique inverse remplacés comme spécifié par la norme ANSI C.

Vous pouvez faire ceci:

echo $'hello\tworld' 
3

Utilisez la combinaison de touches verbatim, ^V (CTRL+V, C-v, quelle que soit ).

Lorsque vous tapez ^V dans le terminal (ou dans la plupart des éditeurs Unix), le caractère suivant est pris verbatim. Vous pouvez l'utiliser pour taper un caractère de tabulation littéral dans une chaîne que vous répétez.

Quelque chose comme les travaux suivants:

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

Bash docs (QV, "cité-insert")

-insert cité (Cq, Cv) Ajouter le caractère suivant que vous tapez à la ligne verbatim. Voici comment insérer des séquences de touches comme C-q, par exemple.

côté Note: selon ce,ALT+TABdevrait faire la même chose, mais nous avons tous liés cette séquence à la fenêtre de commutation de sorte que nous ne pouvons pas l'utiliser

tab- insert (M-TAB) Insérer un caractère de tabulation.

-

Remarque: vous pouvez utiliser cette stratégie avec toutes sortes de personnages hors du commun. Comme un retour chariot:

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

En effet, le retour de chariot est ASCII 13 et M est la 13e lettre de l'alphabet, de sorte que lorsque vous tapez ^M, vous obtenez le 13 caractères ASCII.Vous pouvez le voir en action en utilisant ls^M, à une invite vide, ce qui va insérer un retour chariot, provoquant l'invite à agir comme vous l'avez fait. Lorsque ces caractères sont normalement interprétés, verbatim obtient le caractère littéral.

+0

Je voudrais pouvoir vous donner plus de votes pour celui-ci. Je ne voulais pas utiliser -e dans mes arguments dans ce cas, et cela fonctionne très bien. Merci! –

Questions connexes