Eco newline in stampe Bash letterali \ n


2366

In Bash, ho provato questo:

echo -e "hello\nworld"

Ma non stampa solo una riga \n. Come posso farlo stampare la nuova riga?

Sto usando Ubuntu 11.04.


265
Per quelli che dicono "funziona per me", il comportamento dell'eco varia un po 'tra le versioni. Alcuni persino stamperanno "-e" come parte del loro output. Se vuoi un comportamento prevedibile per qualsiasi cosa non banale, usa invece printf (come nella risposta di @ sth).
Gordon Davisson,

6
Non sono riuscito a ottenere alcun suggerimento in questa risposta, perché, come risulta, stavo tentando di usarlo in una funzione che restituisce un valore e tutti i messaggi echo (e printf) nella funzione venivano aggiunti il valore restituito dopo essere stato rimosso singolarmente dalle nuove righe . Ecco una domanda a riguardo, con una risposta estremamente approfondita: stackoverflow.com/questions/27872069/… Questo è stato come un tour misterioso di tre ore.
aliteralmind

8
Notevole anche: in Unix & Linux Stack Exchange, la risposta accettata a Come aggiungere nuove righe quando si utilizza echo
Graham Perrin,

@GrahamPerrin, grazie per il link a una risposta molto buona e dettagliata davvero! Penso che sia meglio delle risposte di seguito.
Konstantin,

2
echo -ne "hello \ nworld" (per interpretare le escape occorreva la bandiera n) - ma come dicono altri, comandi echo diversi possono avere risultati diversi!
Konchog

Risposte:


2879

È possibile utilizzare printfinvece:

printf "hello\nworld\n"

printfha un comportamento più coerente di echo. Il comportamento di echovaria notevolmente tra le diverse versioni.


49
o anche printf %"s\n" hello world- printf riutilizzerà il formato se vengono forniti troppi argomenti
glenn jackman,

28
L'OP ha chiesto di eco, non di printf; e la risposta di @ choroba di seguito, che utilizza l'opzione -e, riempie perfettamente il conto.
GESii

57
@JESii: si adatta se ti echocapita di supportare l' -eopzione.
qc

11
Con alcune versioni di echo, -eè appena stampato nell'output stesso, quindi penso che questa risposta sia perfettamente valida poiché echonon è coerente qui (a meno che non stiamo parlando di una versione specifica).
Tejas Manohar,

14
Questo va bene se printf è disponibile, ma a differenza di echo a volte printf non è sulla distribuzione.
bigtunacan,

1713

Sei sicuro di essere a Bash? Funziona per me, in tutti e quattro i modi:

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

368
-e flag lo ha fatto per me, il che "abilita l'interpretazione di backslash
escape

21
Penso che -eparam non esista su tutti i sistemi operativi * nix
kenorb

12
@kenorb: esiste in bash. È incorporato.
Choroba,

Perché il terzo funziona? Senza $ restituisce "Hello n world"
Evan Donovan,

21
Come menzionato da vari altri, NON funziona per tutte le distribuzioni e versioni. In alcuni casi viene ignorato e in altri verrà effettivamente stampato. Non credo che sia stato risolto per l'OP, quindi non dovrebbe essere accettata la risposta
csga5000,

578
echo $'hello\nworld'

stampe

hello
world

$''le stringhe utilizzano ANSI C Citando :

Le parole del modulo sono trattate in modo speciale. La parola si espande in stringa , con i caratteri con escape backslash sostituiti come specificato dallo standard ANSI C.$'string'


15
@EvgeniSergeev Non sono sicuro di cosa intendi, ma non ha funzionato neanche per me. E questo perché stavo usando doppie virgolette e risulta che funziona solo con virgolette singole! Ho provato a Terminale su Mac.
trss,

11
Problemi con le variabili nella stringa non espanse.
Willemdh,

Puoi ancora concatenare stringhe con virgolette doppie. `foo =" bar "; echo $ '' $ foo'efoot'`
Kamafeather,

141

Puoi sempre fare echo "".

per esempio

echo "Hello"
echo ""
echo "World"

6
echo ""funziona per me e penso che sia il modo più semplice per stampare una nuova riga, anche se questo non risponde direttamente alla domanda. Saluti.
Mario Awad,

2
Penso che sia meno ovvio (e quindi potenzialmente più confuso) di echo -en "\n".
DBedrenko,

72
echoè sufficiente per ottenere una riga vuota
ROMANIA_engineer

5
@Okneloper Funziona bene per me.
Matteo Leggi il

71

Provare

echo -e "hello\nworld"
hello
world

ha lavorato per me nanonell'editore.

Dalla pagina man:

-e abilitare l'interpretazione di escape backslash


41

Nella remota possibilità che qualcuno si trovi a sbattere la testa contro il muro cercando di capire perché la sceneggiatura di un collega non stampa nuove righe, cerca questo ->

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

echo $(GET_RECORDS);

Come in precedenza, l'esecuzione effettiva del metodo può essere racchiusa in un'eco che sostituisce qualsiasi eco che può essere presente nel metodo stesso. Ovviamente l'ho annacquato per brevità, non è stato così facile individuarlo!

Puoi quindi informare i tuoi compagni che un modo migliore per eseguire le funzioni sarebbe così:

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

GET_RECORDS;

Assicurati di racchiudere la variabile tra virgolette prima di riecheggiarla dal metodo.
ingyhere il

23

Questo funziona per me in Raspbian,

echo -e "hello\\nworld"

2
Funziona anche per me in GitBash su Windows 7 ;-)
Big Rich

3
Una singola barra rovesciata dovrebbe essere sufficiente
Felix D.

23

POSIX 7 su eco

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

-e non è definito e le barre rovesciate sono definite dall'implementazione:

Se il primo operando è -n o se uno degli operandi contiene un carattere <barra rovesciata, i risultati sono definiti dall'implementazione.

a meno che tu non abbia un'estensione XSI opzionale.

Quindi ti consiglio di usare printfinvece, che è ben specificato:

l'operando di formato deve essere usato come stringa di formato descritta nella notazione del formato di file XBD [...]

la notazione sul formato del file :

\ n <newline> Sposta la posizione di stampa all'inizio della riga successiva.

Inoltre, tieni presente che Ubuntu 15.10 e la maggior parte delle distribuzioni implementano echoentrambi come:

  • un Bash integrato: help echo
  • un eseguibile autonomo: which echo

che può creare confusione.


17

Digita semplicemente

echo

per ottenere una nuova linea


3
Risposta ampiamente sottovalutata, non posso credere che questa domanda abbia accumulato più di 20 risposte dal 2011 e che nessuna di queste contiene questa semplice soluzione.
Prometeo

alias c = 'echo; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ;' Questo è l'unico modo in cui posso cancellare il mio schermo, grazie!
Ahi Tuna

@Ahi Tuna: utilizza invece le scorciatoie da tastiera della tua console :)
R dom

@RSun e come lo farei su una finestra del terminale Debian su un Chromebook?
Ahi Tuna,

1
@AhiTuna clear; o ctrl + l;
Mike Seeds,

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

Questa è in realtà un'ottima risposta poiché funziona per le concatenazioni di stringhe. Grande!
LavaScorned,

1
Perché preoccuparsi di invocare un secondo programma? Non è che stiamo cercando di scrivere un'applicazione in tempo reale in bash;) ma non è necessario.
Felix D.

questa è davvero un'ottima risposta che dovrebbe funzionare ovunque, non importa quale. Mi hai salvato l'amico mio giorno @alinsoar
Kashyap Kotak il


6

Puoi anche fare:

echo "hello
world"

Funziona sia all'interno di uno script che dalla riga di comando.
Nella riga di comando, premi Shift+ Enterper eseguire le interruzioni di riga all'interno della stringa.

Questo funziona per me sul mio macOS e sul mio Ubuntu 18.04


Come si digita quell'interruzione di riga senza che la shell esegua il comando quando si preme Ènter`?
Xenos,

@Xenos Funziona bene in uno script. E nella console, fai clic su Maiusc + Invio per aggiungere una nuova riga per evitare che la shell esegua il comando incompiuto.
Vinzee,

5

Un'altra voce qui per coloro che non l'hanno fatto funzionare con nessuna di queste soluzioni e hanno bisogno di ottenere un valore di ritorno dalla loro funzione:

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

r=$(foo "my message");
echo -e $r;

Solo questo trucco ha funzionato in un Linux su cui stavo lavorando con questo bash:

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

Spero che aiuti qualcuno con un problema simile.


4

La mia sceneggiatura:

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

Produzione:

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

Sul mio script bash mi stavo arrabbiando come te fino a quando non ho appena provato:

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

Basta premere invio nel punto in cui si desidera inserire quel salto. L'output ora è:

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

4
Solo una nota, probabilmente vorrai usare $ {} attorno ai nomi delle tue variabili poiché non farlo può portare a comportamenti davvero strani quando una shell trova una variabile chiamata $ warningsFound e stampa quello e non i due output separati.
dragon788,

@ dragon788 forse mi manca qualcosa, ma la variabile IS in realtà si chiama $ warningsFound?
psynnott,

2
Ho perso una parola su questo. Se avessi una variabile chiamata $ avvertimenti, in alcuni casi senza usare $ {warningsFound}, potresti potenzialmente finire con il contenuto di $ avvertimenti + "Trovato" invece della variabile che intendevi.
dragon788,

3

Puoi anche usare l'eco con le parentesi graffe,

$ (echo hello; echo world)
hello
world

errore di sintassi vicino al token imprevisto `('quando chiamato nel file
.sh

1
provaecho hello; echo world
Avinash Raj,

1
O "echo hello && echo world" o semplicemente: "echo hello echo world
csga5000

3

Questo potrebbe essere fatto meglio come

x="\n"
echo -ne $x

-e l'opzione interpreterà i backslahes per la sequenza di escape
-n l'opzione rimuoverà la nuova riga finale nell'output

PS: il comando echo ha l'effetto di includere sempre una nuova riga finale nell'output, quindi è necessario -n per spegnere quella cosa (e renderla meno confusa)


echo -ne "ciao \ nworld" per la risposta esatta alla domanda :)
Dhwanit,

3

È stato aggiunto un nuovo parametro di espansionebash 4.4 che interpreta le sequenze di escape:

${parameter@operator} - E operator

L'espansione è una stringa che è il valore del parametro con sequenze di escape barra rovesciata espanse come con il $'…'meccanismo di quotazione.

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

2

Se stai scrivendo script e ripeterai ripetutamente le nuove righe come parte di altri messaggi, una buona soluzione multipiattaforma consiste nel mettere una nuova riga letterale in una variabile in questo modo:

newline='
'

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

0

A volte puoi passare più stringhe separate da uno spazio e verrà interpretato come \n.

Ad esempio quando si utilizza uno script shell per le notifiche multilinea:

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

Questo non è corretto Non viene mai interpretato come \n. Viene interpretato come un argomento separato per il programma e il programma stesso può visualizzare tale argomento su una nuova riga, ma ciò non significa che sia stato convertito \nin qualsiasi punto e sia interamente dipendente dal programma.
Score_Under

0

Ho dovuto circondare il testo con doppie virgolette mentre usavo come alias nel profilo bash (MacOx, iTerm).

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

0

Questo mi ha portato lì ....

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

I rendimenti:

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

Uso echo senza argomenti

echo "Hello"
echo
echo "World"

-2

Soluzione aggiuntiva:

In alcuni casi, devi fare l'eco su più righe dei contenuti lunghi (come codice / configurazioni)

Per esempio :

  • Uno script Bash per generare codici / configurazioni

echo -e, printf potrebbe avere qualche limitazione

È possibile utilizzare alcuni caratteri speciali come segnaposto come interruzione di riga (come ~) e sostituirli dopo la creazione del file mediantetr

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

deve invocare un altro programma ( tr) che dovrebbe andare bene IMO.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.