Pour ceux qui disent "ça marche pour moi", le comportement de l'écho varie un peu selon les versions. Certains imprimeront même le "-e" dans le cadre de leur sortie. Si vous voulez un comportement prévisible pour tout ce qui n'est pas trivial, utilisez plutôt printf (comme dans la réponse de @ sth).
Gordon Davisson
6
Je n'ai pu faire fonctionner aucune des suggestions de cette réponse, car, en fin de compte, j'essayais de l'utiliser dans une fonction qui renvoie une valeur , et tous les messages echo (et printf) de la fonction étaient ajoutés à la valeur de retour après avoir été individuellement dépouillé de nouvelles lignes . Voici une question à ce sujet, avec une réponse extrêmement approfondie: stackoverflow.com/questions/27872069/… C'était comme une visite mystère de trois heures.
aliteralmind
8
A noter également: dans Unix et Linux Stack Exchange, la réponse acceptée à Comment ajouter de nouvelles lignes lors de l'utilisation d'écho
Graham Perrin
@GrahamPerrin, merci pour le lien vers une réponse très bonne et détaillée! Je pense que c'est mieux que les réponses ci-dessous.
Konstantin
2
echo -ne "hello \ nworld" (vous aviez besoin du drapeau n pour interpréter les échappements) - mais comme d'autres le disent, différentes commandes d'écho peuvent avoir des résultats différents!
Konchog
Réponses:
2881
Vous pouvez utiliser à la printfplace:
printf "hello\nworld\n"
printfa un comportement plus cohérent que echo. Le comportement de echovarie considérablement entre les différentes versions.
ou même printf %"s\n" hello world- printf réutilisera le format si trop d'arguments sont fournis
glenn jackman
28
Le PO a posé des questions sur l'écho, pas sur printf; et la réponse de @ choroba ci-dessous, qui utilise l'option -e, remplit parfaitement la facture.
JESii
57
@JESii: Cela convient si vous echosoutenez l' -eoption.
STH
11
Avec certaines versions de echo, -eest simplement imprimé dans la sortie elle-même, donc je pense que cette réponse est parfaitement valide car elle echon'est pas cohérente ici (sauf si nous parlons d'une version spécifique).
Tejas Manohar
14
C'est bien beau si printf est disponible, mais contrairement à echo, parfois printf n'est pas sur la distribution.
bigtunacan
1714
Êtes-vous sûr d'être en bash? Fonctionne pour moi, dans les quatre sens:
-e flag l'a fait pour moi, ce qui "permet d'interpréter les échappements antislash"
tandy
21
Je pense que -eparam n'existe pas sur tous les systèmes d'exploitation * nix
kenorb
12
@kenorb: Il existe en bash. C'est une fonction intégrée.
choroba
Pourquoi le troisième fonctionne-t-il? Sans le $, il renvoie "Hello n world"
Evan Donovan
21
Comme mentionné par divers autres -e ne fonctionne pas pour toutes les distributions et versions. Dans certains cas, il est ignoré et dans d'autres, il sera imprimé. Je ne crois pas que cela l'a corrigé pour l'OP, donc ne devrait pas être accepté réponse
Les mots du formulaire sont traités spécialement. Le mot se développe en chaîne , avec des caractères d'échappement antislash remplacés comme spécifié par la norme C ANSI.$'string'
@EvgeniSergeev Je ne sais pas ce que tu veux dire, mais cela n'a pas fonctionné pour moi non plus en premier. Et c'est parce que j'utilisais des guillemets doubles et il s'avère que cela ne fonctionne qu'avec des guillemets simples! J'ai essayé dans Terminal sur Mac.
trss
11
Problèmes avec les variables de la chaîne non développées.
willemdh
Vous pouvez toujours concaténer des chaînes de guillemets doubles. `foo =" bar "; echo $ '' $ foo'efoot'`
echo ""fonctionne pour moi et je pense que c'est la forme la plus simple pour imprimer une nouvelle ligne, même si cela ne répond pas directement à la question. À votre santé.
Mario Awad du
2
Je pense que c'est moins évident (et donc potentiellement plus déroutant) que echo -en "\n".
DBedrenko
72
echosuffit pour obtenir une ligne vide
ROMANIA_engineer
5
@Okneloper fonctionne très bien pour moi.
Matthew Read
71
Essayer
echo -e "hello\nworld"
hello
world
travaillé pour moi dans l' nanoéditeur.
Depuis la page de manuel:
-e permettre l'interprétation des échappements antislash
Dans le cas où quelqu'un se retrouverait à se battre la tête contre le mur en essayant de comprendre pourquoi le script d'un collègue n'imprimerait pas de nouvelles lignes, faites attention à cela ->
#!/bin/bashfunction GET_RECORDS(){
echo -e "starting\n the process";}
echo $(GET_RECORDS);
Comme dans ce qui précède, le fonctionnement réel de la méthode peut lui-même être enveloppé dans un écho qui remplace tous les échos qui peuvent être dans la méthode elle-même. Évidemment, j'ai édulcoré cela pour être bref, 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 la suivante:
#!/bin/bashfunction GET_RECORDS(){
echo -e "starting\n the process";}
GET_RECORDS;
Réponse largement sous-estimée, je ne peux pas croire que cette question a amassé plus de 20 réponses depuis 2011 et qu'aucune d'entre elles ne contient cette solution simple.
C'est en fait une excellente réponse car cela fonctionne pour les concaténations de chaînes. Génial!
LavaScornedOven
1
Pourquoi s'embêter à invoquer un deuxième programme? Ce n'est pas que nous essayons d'écrire une application en temps réel en bash;) mais ce n'est pas nécessaire.
Felix D.
c'est vraiment une excellente réponse qui devrait fonctionner partout, quoi qu'il arrive. Vous avez sauvé mon ami du jour @alinsoar
Cela fonctionne à la fois à l'intérieur d'un script et à partir de la ligne de commande.
Sur la ligne de commande, appuyez sur Shift+Enter pour effectuer les sauts de ligne à l'intérieur de la chaîne.
Cela fonctionne pour moi sur mon macOS et mon Ubuntu 18.04
Comment tapez-vous ce saut de ligne sans avoir le shell pour exécuter la commande lorsque vous appuyez sur Ènter`?
Xenos
@Xenos Cela fonctionne bien dans un script. Et dans la console, cliquez simplement sur Shift + Entrée pour ajouter une nouvelle ligne pour éviter d'avoir le shell pour exécuter la commande inachevée.
vinzee
5
Une autre entrée 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é dans un linux sur lequel je travaillais avec ce bash:
GNU bash, version 2.2.25(1)-release (x86_64-redhat-linux-gnu)
J'espère que cela aide quelqu'un avec un problème similaire.
Juste une note, vous voudrez probablement utiliser $ {} autour de vos noms de variables car ne pas le faire peut conduire à un comportement vraiment bizarre lorsqu'un shell trouve une variable appelée $ warningsFound et l'imprime et non les deux sorties distinctes.
dragon788
@ dragon788 il me manque peut-être quelque chose, mais la variable EST en fait appelée $ warningsFound?
psynnott
2
J'ai raté un mot là-dessus. Si vous aviez une variable appelée $ warnings, dans certains cas sans utiliser $ {warningsFound}, vous pourriez potentiellement vous retrouver avec le contenu de $ warnings + "Found" au lieu de la variable que vous vouliez.
dragon788
3
Vous pouvez également utiliser l'écho avec des accolades,
erreur de syntaxe près du jeton inattendu `('lorsqu'il est appelé dans un fichier .sh
cosbor11
1
essayerecho hello; echo world
Avinash Raj
1
Ou "echo hello && echo world" ou simplement: "echo hello echo world
csga5000
3
Cela pourrait être mieux fait
x="\n"
echo -ne $x
L'option -e interprétera les backslahes pour la séquence d'échappement. L'
option -n supprimera la nouvelle ligne de fin dans la sortie.
PS: la commande echo a pour effet d'inclure toujours une nouvelle ligne de fin dans la sortie, donc -n est requis pour désactiver cette chose (et la rendre moins confuse)
echo -ne "hello \ nworld" pour la réponse exacte à la question :)
Dhwanit
3
Il y a une nouvelle extension de paramètre ajoutée bash 4.4qui interprète les séquences d'échappement:
${parameter@operator} - E operator
L'expansion est une chaîne qui est la valeur du paramètre avec des séquences d'échappement antislash développées comme avec le $'…'mécanisme de citation.
$ foo='hello\nworld'
$ echo "${foo@E}"
hello
world
Si vous écrivez des scripts et que vous répéterez plusieurs fois des sauts de ligne dans d'autres messages, une bonne solution multiplateforme consiste à mettre un saut de ligne littéral dans une variable comme ceci:
newline='
'
echo "first line$newlinesecond line"
echo "Error: example error message n${newline}${usage}">&2#requires usage to be defined
Ceci est une erreur. Il n'est jamais interprété comme \n. Il est interprété comme un argument distinct du programme, et le programme lui-même peut afficher cet argument sur une nouvelle ligne, mais cela ne signifie pas qu'il a été converti en \nà tout moment et dépend entièrement du programme.
Score_Under
0
J'ai dû entourer le texte de guillemets tout en l'utilisant comme alias dans le profil bash (MacOx, iTerm).
Dans les cas, vous devez faire écho à plusieurs lignes du contenu long (comme le code / les configurations)
Par exemple :
Un script Bash pour générer des codes / configurations
echo -e,
printfpourrait avoir une limitation
Vous pouvez utiliser un caractère spécial comme espace réservé comme saut de ligne (tel que ~) et le remplacer après la création du fichier à l'aide detr
echo ${content}| tr '~''\n'> $targetFile
il doit invoquer un autre programme ( tr) qui devrait convenir à l'OMI.
Réponses:
Vous pouvez utiliser à la
printf
place:printf
a un comportement plus cohérent queecho
. Le comportement deecho
varie considérablement entre les différentes versions.la source
printf %"s\n" hello world
- printf réutilisera le format si trop d'arguments sont fournisecho
soutenez l'-e
option.echo
,-e
est simplement imprimé dans la sortie elle-même, donc je pense que cette réponse est parfaitement valide car elleecho
n'est pas cohérente ici (sauf si nous parlons d'une version spécifique).Êtes-vous sûr d'être en bash? Fonctionne pour moi, dans les quatre sens:
la source
-e
param n'existe pas sur tous les systèmes d'exploitation * niximpressions
$''
les chaînes utilisent la citation ANSI C :la source
Tu pourrais toujours faire
echo ""
.par exemple
la source
echo ""
fonctionne pour moi et je pense que c'est la forme la plus simple pour imprimer une nouvelle ligne, même si cela ne répond pas directement à la question. À votre santé.echo -en "\n"
.echo
suffit pour obtenir une ligne videEssayer
travaillé pour moi dans l'
nano
éditeur.Depuis la page de manuel:
la source
Dans le cas où quelqu'un se retrouverait à se battre la tête contre le mur en essayant de comprendre pourquoi le script d'un collègue n'imprimerait pas de nouvelles lignes, faites attention à cela ->
Comme dans ce qui précède, le fonctionnement réel de la méthode peut lui-même être enveloppé dans un écho qui remplace tous les échos qui peuvent être dans la méthode elle-même. Évidemment, j'ai édulcoré cela pour être bref, 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 la suivante:
la source
Cela fonctionne pour moi à Raspbian,
la source
POSIX 7 sur l'é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:sauf si vous disposez d'une extension XSI en option.
Je recommande donc d'utiliser à la
printf
place, ce qui est bien spécifié:la notation du format de fichier :
Gardez également à l'esprit que Ubuntu 15.10 et la plupart des distributions implémentent les
echo
deux comme:help echo
which echo
ce qui peut entraîner une certaine confusion.
la source
Tapez simplement
pour obtenir une nouvelle ligne
la source
la source
Cela fonctionne pour moi dans CentOS:
la source
Vous pouvez également faire:
Cela fonctionne à la fois à l'intérieur d'un script et à partir de la ligne de commande.
Sur la ligne de commande, appuyez sur Shift+Enter pour effectuer les sauts de ligne à l'intérieur de la chaîne.
Cela fonctionne pour moi sur mon macOS et mon Ubuntu 18.04
la source
Une autre entrée 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:
Seule cette astuce a fonctionné dans un linux sur lequel je travaillais avec ce bash:
J'espère que cela aide quelqu'un avec un problème similaire.
la source
Mon script:
Production:
Sur mon script bash, je devenais fou comme vous jusqu'à ce que je viens d'essayer:
Appuyez simplement sur Entrée où vous souhaitez insérer ce saut. La sortie est maintenant:
la source
Vous pouvez également utiliser l'écho avec des accolades,
la source
echo hello; echo world
Cela pourrait être mieux fait
L'option -e interprétera les backslahes pour la séquence d'échappement. L'
option -n supprimera la nouvelle ligne de fin dans la sortie.
PS: la commande echo a pour effet d'inclure toujours une nouvelle ligne de fin dans la sortie, donc -n est requis pour désactiver cette chose (et la rendre moins confuse)
la source
Il y a une nouvelle extension de paramètre ajoutée
bash 4.4
qui interprète les séquences d'échappement:la source
Si vous écrivez des scripts et que vous répéterez plusieurs fois des sauts de ligne dans d'autres messages, une bonne solution multiplateforme consiste à mettre un saut de ligne littéral dans une variable comme ceci:
la source
Parfois, vous pouvez passer plusieurs chaînes séparées par un espace et cela sera interprété comme
\n
.Par exemple, lors de l'utilisation d'un script shell pour les notifications multi-lignes:
la source
\n
. Il est interprété comme un argument distinct du programme, et le programme lui-même peut afficher cet argument sur une nouvelle ligne, mais cela ne signifie pas qu'il a été converti en\n
à tout moment et dépend entièrement du programme.J'ai dû entourer le texte de guillemets tout en l'utilisant comme alias dans le profil bash (MacOx, iTerm).
la source
Cela m'a amené là ....
Rendements:
la source
J'utilise juste l'écho sans arguments
la source
Solution supplémentaire:
Dans les cas, vous devez faire écho à plusieurs lignes du contenu long (comme le code / les configurations)
Par exemple :
echo -e
,printf
pourrait avoir une limitationVous pouvez utiliser un caractère spécial comme espace réservé comme saut de ligne (tel que
~
) et le remplacer après la création du fichier à l'aide detr
il doit invoquer un autre programme (
tr
) qui devrait convenir à l'OMI.la source