Pourquoi «wc -c» imprime-t-il une valeur de plus avec echo?


13

Lors de l'exécution

echo abcd | wc -c

il revient 5.
Mais le mot abcdne fait que 4 caractères.

Est-ce que l' echoimpression d'un caractère spécial après le mot abcd?

Et puis-je empêcher echod'imprimer cela?



1
Veuillez noter que wc -ccela ne vous dit pas combien de caractères quelque chose est; il indique seulement combien d'octets il s'agit.
tchrist

Réponses:


21

echoimprimer la nouvelle ligne ( \n) à la fin de la ligne

echo abcd | xxd
0000000: 6162 6364 0a          abcd.

Avec certaines echoimplémentations, vous pouvez utiliser -n:

-n ne pas afficher la nouvelle ligne de fin

et tester:

echo -n abcd | wc -c
4

Avec d'autres, vous avez besoin de la \cséquence d'échappement:

\c: Supprime le <newline>qui suit sinon l'argument final dans la sortie. Tous les caractères suivant le '\c'dans les arguments doivent être ignorés.

echo -e 'abcd\c' | wc -c
4

Portablement, utilisez printf:

printf %s abcd | wc -c
4

(notez que wc -ccompte les octets, pas les caractères (bien que dans le cas où abcdils sont généralement équivalents). Utilisez wc -mpour compter les caractères).


Notez que le fait est qu'avec certaines echoimplémentations (toutes compatibles avec Unix au moins), c'est uniquement les echo 'abcd\c'sorties abcd. echo -e 'abcd\c'dans les echoimplémentations conformes à Unix sortirait -e abcd.
Stéphane Chazelas

5

Si vous exécutez echosans l' -noption, il écrit un caractère de nouvelle ligne après les arguments. Sinon, si vous avez tapé echo foo, votre prochaine invite de shell apparaîtra à droite de foo. Il en  wcva de même pour la nouvelle ligne.

Comment puis-je empêcher echod'imprimer cela?

echo -n abcd | wc -c

2

Par défaut, echoimprime un caractère de nouvelle ligne ( \n) après la chaîne (c'est pourquoi vous voyez l'invite du shell sur la ligne suivante au lieu de la même ligne où abcdest imprimée.)

Vous pouvez essayer d'ajouter un -nparamètre à echopour désactiver le caractère de nouvelle ligne de fin.

echo -n abcd | wc -c
4
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.