web-dev-qa-db-fra.com

Echo newline dans Bash affiche littéralement \ n

Dans Bash, j'ai essayé ceci:

echo -e "hello\nworld"

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

J'utilise Ubuntu 11.04.

2061
Sergey

Vous pouvez utiliser printf à la place:

printf "hello\nworld\n"

printf a un comportement plus cohérent que echo. Le comportement de echo varie considérablement d'une version à l'autre.

2529
sth

Êtes-vous sûr que vous êtes en bash? Fonctionne pour moi de trois façons:

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

empreintes

hello
world

$'' chaînes utilisent Citations ANSI C :

Les mots de la forme $'string' sont traités spécialement. La Parole s'étend à chaîne, avec des caractères d'échappement avec barre oblique inversée remplacés comme spécifié par la norme ANSI C.

521
Vanuan

Vous pouvez toujours faire echo "".

par exemple.

echo "Hello"
echo ""
echo "World"
122
Nayeem Zen

Au cas où quelqu'un se retrouverait en train de frapper sa tête contre le mur en essayant de comprendre pourquoi le script d'un collègue n'imprimait pas de nouvelles lignes, faites attention à cela ->

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

echo $(GET_RECORDS);

Comme dans ce qui précède, le déroulement réel de la méthode peut lui-même être encapsulé dans un écho qui remplace tout écho pouvant figurer dans la méthode elle-même. Évidemment, je l'ai éclaircie par souci de concision, ce n'était pas si facile à repérer!

Vous pouvez ensuite informer vos camarades qu’une meilleure façon d’exécuter des fonctions serait la suivante:

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

GET_RECORDS;
39
Uncle Iroh

Essayer

echo -e "hello\nworld"
hello
world

travaillé pour moi dans nano editor.

34
Harsha Biyani

Cela fonctionne pour moi à Raspbian,

echo -e "hello\\nworld"
23
Sathesh

POSIX 7 sur echo

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 <barre oblique inverse>, les résultats sont définis par l'implémentation.

sauf si vous avez une extension XSI en option.

Je vous recommande donc d’utiliser plutôt printf , ce qui est bien spécifié:

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

le notation de format de fichier :

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

N'oubliez pas non plus qu'Ubuntu 15.10 et la plupart des distributions implémentent echo en tant que:

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

ce qui peut entraîner une certaine confusion.

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

Cela fonctionne pour moi dans CentOS:

echo -e ""hello\nworld""
9
vanishedzhou

Vous pouvez aussi faire:

echo "hello
world"

Cela fonctionne à la fois dans un script et à partir de la ligne de commande.
Dans la ligne de commande, appuyez sur Shift+Enter faire les sauts de ligne à l'intérieur de la chaîne.

Cela fonctionne pour moi sur mon macOS et mon Ubuntu 18.04

5
vinzee

Tapez simplement

echo

pour obtenir une nouvelle ligne

4
SiteTester

Une entrée de plus ici pour ceux qui ne l'ont pas fait fonctionner avec l'une de ces solutions et qui 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é sur 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.

4
DNT

Mon script:

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

Sortie:

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

Sur mon script bash, je devenais en colère comme vous jusqu'à ce que je viens d'essayer:

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

Appuyez simplement sur Entrée à l'endroit où vous souhaitez insérer ce saut. La sortie est maintenant:

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

Cela pourrait être mieux fait comme

x="\n"
echo -ne $x

L'option -e interprétera les antislahs pour la séquence d'échappement
L'option - n supprimera le retour à la ligne final dans la sortie

PS: la commande echo a pour effet d'inclure toujours un retour à la ligne dans la sortie, donc -n est nécessaire pour la désactiver (et la rendre moins déroutante).

3
Dhwanit

Il y a un nouveau expansion du paramètre ajouté dans _bash 4.4_ qui interprète les séquences d'échappement:

${parameter@operator} - E operator

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

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

Vous pouvez également utiliser echo avec des accolades,

$ (echo hello; echo world)
hello
world
2
Avinash Raj

Dans les cas, vous devez faire écho au long contenu (tel que le code) avec une concatination env var et vous avez voulu le simplifier.

echo -e, printf pourrait avoir certaines limitations

Vous pouvez utiliser des caractères spéciaux comme espace réservé pour les sauts de ligne (tels que ~)

et essayez ceci:

echo ${content} | tr '~' '\n' > $targetFile

il doit invoquer un autre programme (tr) qui devrait convenir à l’OMI.

0
ZenithS

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

Par exemple, lorsque vous utilisez un script Shell pour les notifications multi-lignes:

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

Si vous écrivez des scripts et que vous répétez plusieurs fois les nouvelles lignes dans d'autres messages, une solution multiplate-forme de Nice consiste à insérer une nouvelle ligne littérale dans une variable comme celle-ci:

newline='
'

echo "first line$newlinesecond line"
echo "Error: example error message n${newline}${usage}" >&2 #requires usage to be defined
0
skiggety

Je devais entourer le texte de guillemets tout en utilisant comme alias le profil bash (MacOx, iTerm).

alias helloworld="echo -e \"hello \n world\""
0
John Jai