Echo newline dans Bash imprime le littéral \ n

Dans Bash, a essayé ceci:

echo -e "hello\nworld" 

Mais cela n’imprime pas une nouvelle ligne, seulement \n . Comment puis-je le faire imprimer la nouvelle ligne?

J’utilise Ubuntu 11.04.

Vous pouvez utiliser printf place:

 printf "hello\nworld\n" 

printf a un comportement plus cohérent que l’ echo . Le comportement de l’ echo varie considérablement entre les différentes versions.

Êtes-vous sûr d’être à bash? Fonctionne pour moi, toutes les trois manières:

 echo -e "Hello\nworld" echo -e 'Hello\nworld' echo Hello$'\n'world 
 echo $'hello\nworld' 

estampes

 hello world 

$'' chaînes $'' utilisent les citations C ANSI :

Les mots de la forme $' ssortingng ' sont traités spécialement. Le mot se développe en chaîne , avec des caractères d’échappement antislash inversés comme spécifié par la norme ANSI C.

Vous pouvez toujours faire echo "" .

par exemple

 echo "Hello" echo "" echo "World" 

Si quelqu’un se heurte contre le mur en essayant de comprendre pourquoi le script d’un collègue n’imprime pas de nouvelles lignes, cherchez-le ->

 #!/bin/bash function GET_RECORDS() { echo -e "starting\n the process"; } echo $(GET_RECORDS); 

Comme dans ce qui précède, le fonctionnement même de la méthode peut être lui-même encapsulé dans un écho qui remplace tout écho pouvant se trouver dans la méthode elle-même. Evidemment, je l’ai arrosé pour la brièveté, ce n’était pas si facile à repérer!

Vous pouvez alors informer vos camarades qu’une meilleure façon d’exécuter des fonctions serait comme suit:

 #!/bin/bash function GET_RECORDS() { echo -e "starting\n the process"; } GET_RECORDS; 

Essayer

 echo -e "hello\nworld" hello world 

a travaillé pour moi dans nano editor.

Cela fonctionne pour moi en raspbian,

echo -e "hello\\nworld"

 str='hello\nworld' $ echo | sed "i$str" hello world 

POSIX 7 sur écho

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html

-e n’est pas défini et les barres obliques inverses sont définies par l’implémentation:

Si le premier opérande est -n ou si l’un des opérandes contient un caractère , les résultats sont définis par l’implémentation.

sauf si vous avez une extension XSI en option.

Alors utilisez plutôt printf :

opérande de format doit être utilisé comme chaîne de format décrite dans la notation du format de fichier XBD […]

la notation du format de fichier :

\ n Déplace la position d’impression au début de la ligne suivante.

Gardez également à l’esprit qu’Ubuntu 15.10 et la plupart des dissortingbutions implémentent l’ echo fois en tant que:

  • un Bash intégré: help echo
  • un exécutable autonome: which echo

ce qui peut entraîner une certaine confusion.

Une autre entrée ici pour ceux qui ne l’ont pas fait fonctionner avec l’une de ces solutions, et doivent obtenir une valeur de retour de leur fonction:

 function foo() { local v="Dimi"; local s=""; ..... s+="Some message here $v $1\n" ..... echo $s } r=$(foo "my message"); echo -e $r; 

Seule cette astuce a fonctionné dans un Linux sur lequel je travaillais avec cette bash:

 GNU bash, version 2.2.25(1)-release (x86_64-redhat-linux-gnu) 

J’espère que ça aide quelqu’un avec un problème similaire.

Mon script:

 echo "WARNINGS: $warningsFound WARNINGS FOUND:\n$warningSsortingngs 

Sortie:

 WARNING : 2 WARNINGS FOUND:\nWarning, found the following local orphaned signature file: 

Sur mon script bash je devenais fou comme toi jusqu’à ce que je vienne d’essayer:

 echo "WARNING : $warningsFound WARNINGS FOUND: $warningSsortingngs" 

Appuyez simplement sur Entrée où vous voulez insérer ce saut. La sortie est maintenant:

 WARNING : 2 WARNINGS FOUND: Warning, found the following local orphaned signature file: 

Vous pouvez également utiliser l’écho avec des accolades,

 $ (echo hello; echo world) hello world 

Cela pourrait mieux être fait comme

 x="\n" echo -ne $x 

-e option interprétera les backslahes pour la séquence d’échappement
l’option -n supprime le nouveau trait de fin dans la sortie

PS: la commande echo a toujours pour effet d’inclure une nouvelle ligne dans la sortie afin que -n soit nécessaire pour désactiver cette fonctionnalité (et la rendre moins confuse)

Vous pouvez aussi faire:

 echo "hello world" 

Cela fonctionne pour moi sur mes macOS.

Parfois, vous pouvez passer plusieurs chaînes séparées par un espace et il sera interprété comme \n .

Par exemple, lors de l’utilisation d’un script shell pour les notifications multi-lignes:

 #!/bin/bash notify-send 'notification success' 'another line' 'time now '`date +"%s"` 

Il y a une nouvelle extension de paramètre ajoutée dans bash 4.4 qui interprète les séquences d’échappement:

${parameter@operator} - E operator

L’expansion est une chaîne qui correspond à la valeur du paramètre avec des séquences d’échappement à barre oblique inverse développées comme avec le mécanisme de citation $'…' .

 $ foo='hello\nworld' $ echo "${foo@E}" hello world 

Cette commande fonctionne pour moi dans CentOS:

 echo -e ""hello\nworld""