Quelle est la différence entre l'utilisation
echo -e "Hello\nWorld"
et
echo $"Hello\nWorld"
ne sortent-ils pas tous les deux:
Hello
World
echo $'Hello\nWorld'
, qui s'imprimeront sur deux lignes sous bash.
Quelle est la différence entre l'utilisation
echo -e "Hello\nWorld"
et
echo $"Hello\nWorld"
ne sortent-ils pas tous les deux:
Hello
World
echo $'Hello\nWorld'
, qui s'imprimeront sur deux lignes sous bash.
Réponses:
echo -e
et echo $'...'
sont tous deux similaires en ce qu'ils prennent en charge les séquences d'échappement suivantes:
\a alert (bell)
\b backspace
\e
\E an escape character
\f form feed
\n new line
\r carriage return
\t horizontal tab
\v vertical tab
\\ backslash
\0nnn the eight-bit character whose value is the octal value nnn (zero to three octal digits)
\xHH the eight-bit character whose value is the hexadecimal value HH (one or two hex digits)
\uHHHH the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHH (one to four hex digits)
\UHHHHHHHH
the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHHHHHH (one to eight hex digits)
Ils ont des différences. En plus de ce qui précède, echo -e
prend en charge:
\c suppress further output
\0nnn the eight-bit character whose value is the octal value nnn (zero to three octal digits)
En revanche, $'....'
prend en charge:
\' single quote \" double quote \nnn the eight-bit character whose value is the octal value nnn (one to three digits) \cx a control-x character
Notez que, entre les deux, les \c
extensions sont incompatibles:
$ echo -e 'start\n\cIstop'
start
$ echo $'start\n\cIstop'
start
stop
Pour echo -e
ci-dessus, \c
supprime la sortie supplémentaire, ignorant ainsi le Istop
. En revanche, pour $'...'
, le \cI
est interprété comme un onglet.
$"..."
En revanche $'...'
, la fonction de $"..."
est assez différente. Cela entraînera la traduction de la chaîne qu'il contient en fonction des paramètres régionaux actuels.
echo -e
controverseecho -e
n'est pas universellement pris en charge par les coques et beaucoup considèrent l' -e
option comme une erreur de conception. Observer:
$ ls
-e -n
$ echo *
$ printf "%s\n" *
-e
-n
Comme vous pouvez le voir, si ce que vous imprimez echo
commence par un tiret, les résultats peuvent être inattendus. À moins que vous ne soyez sûr que la première chaîne avec laquelle vous imprimerez echo
ne commence pas par un tiret, il vaut mieux utiliser printf
.
Pour ces raisons, la norme POSIX conclut :
Les nouvelles applications sont encouragées à utiliser printf au lieu d’écho.
Chet Ramey, qui maintient bash
depuis 22 ans, convient :
[N] ew code devrait utiliser printf.
*
) n'est pas spécifique à echo
. Cela se produit avec n'importe quelle commande qui reconnaît les options courtes ou longues (écrites de manière traditionnelle) et prend les opérandes de nom de fichier, y comprisls
. On peut dire que la situation est un peu pire avec echo
puisque (comme votre source le mentionne) echo
n'accepte généralement pas --
d'indiquer la fin des options, alors que l'on peut écrire des commandes comme ls -- *l
. (Et vraiment, il faut généralement écrire des commandes de cette façon, lorsque vous utilisez des globes qui commencent par *
ou -
, en particulier dans les scripts.)
\n
séquence d'échappement, donc en fait , il n'a pas d' importance si je l' utilise echo -e '...'
, echo $'...'
ouecho $"..."
Hello\nWorld
. Vous avez besoin du-e
commutateur pour interpréter les caractères d'échappement.