Echo newline in Bash imprime littéral \ n


2368

Dans Bash, essayez ceci:

echo -e "hello\nworld"

Mais il n'imprime pas une nouvelle ligne, seulement \n. Comment puis-je faire imprimer la nouvelle ligne?

J'utilise Ubuntu 11.04.


266
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.


49
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:

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

368
-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
csga5000

578
echo $'hello\nworld'

impressions

hello
world

$''les chaînes utilisent la citation ANSI C :

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'


15
@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'`
Kamafeather

141

Tu pourrais toujours faire echo "" .

par exemple

echo "Hello"
echo ""
echo "World"

6
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


41

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/bash
function 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/bash
function GET_RECORDS()
{
   echo -e "starting\n the process";
}

GET_RECORDS;

Assurez-vous d'encapsuler la variable avec des guillemets avant de l'écho de la méthode.
ingyhere

23

Cela fonctionne pour moi à Raspbian,

echo -e "hello\\nworld"

2
Fonctionne aussi pour moi dans GitBash sur Windows 7 ;-)
Big Rich

3
Une seule barre oblique inverse devrait suffire
Felix D.

23

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:

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

sauf si vous disposez d'une extension XSI en option.

Je recommande donc d'utiliser à la printfplace, ce qui est bien spécifié:

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

la notation du format de fichier :

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

Gardez également à l'esprit que Ubuntu 15.10 et la plupart des distributions implémentent les echodeux comme:

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

ce qui peut entraîner une certaine confusion.


17

Tapez simplement

echo

pour obtenir une nouvelle ligne


3
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.
Prométhée

alias c = 'echo; écho ; écho ; écho ; écho ; écho ; écho ; écho ; écho ; écho ; écho ; écho ; écho ; écho ; écho ; écho ; écho ; écho ; écho ; écho ; écho ; écho ; écho ; écho ; écho ; écho ; écho ; écho ; écho ; écho ; écho ; écho ; écho ; écho ; écho ; écho ;' C'est la seule façon de vider mon écran, merci!
Ahi Tuna

@Ahi Tuna: Utilisez plutôt les raccourcis clavier de votre console :)
R Sun

@RSun et comment procéder sur une fenêtre de terminal Debian sur un Chromebook?
Ahi Tuna

1
@AhiTuna clear; ou ctrl + l;
Mike Seeds

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

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
Kashyap Kotak


6

Vous pouvez également faire:

echo "hello
world"

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.


4

Mon script:

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

Production:

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

Sur mon script bash, je devenais fou comme vous jusqu'à ce que je viens d'essayer:

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

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

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

4
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,

$ (echo hello; echo world)
hello
world

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

2

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

0

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:

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

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).

alias helloworld="echo -e \"hello \n world\""

0

Cela m'a amené là ....

outstuff=RESOURCE_GROUP=[$RESOURCE_GROUP]\\nAKS_CLUSTER_NAME=[$AKS_CLUSTER_NAME]\\nREGION_NAME=[$REGION_NAME]\\nVERSION=[$VERSION]\\nSUBNET-ID=[$SUBNET_ID]
printf $outstuff

Rendements:

RESOURCE_GROUP=[akswork-rg]
AKS_CLUSTER_NAME=[aksworkshop-804]
REGION_NAME=[eastus]
VERSION=[1.16.7]
SUBNET-ID=[/subscriptions/{subidhere}/resourceGroups/makeakswork-rg/providers/Microsoft.Network/virtualNetworks/aks-vnet/subnets/aks-subnet]

-1

J'utilise juste l'écho sans arguments

echo "Hello"
echo
echo "World"

-2

Solution supplémentaire:

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.

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.