Echo nowej linii w Bash drukuje dosłownie \ n

2361

W Bash próbowałem tego:

echo -e "hello\nworld"

Ale nie drukuje tylko nowej linii \n. Jak mogę go wydrukować nowy wiersz?

Używam Ubuntu 11.04.

Siergiej
źródło
263
Dla tych, którzy mówią „to działa dla mnie”, zachowanie echa różni się w zależności od wersji. Niektórzy nawet wydrukują „-e” jako część swoich wyników. Jeśli chcesz zachować przewidywalne zachowanie dla czegoś nietypowego, użyj printf zamiast (jak w odpowiedzi @ sth).
Gordon Davisson
6
Nie mogłem uruchomić żadnej z sugestii w tej odpowiedzi, ponieważ, jak się okazuje, próbowałem użyć jej w funkcji, która zwraca wartość , a wszystkie komunikaty echa (i printf) w funkcji były dołączane do wartość zwracana po indywidualnym pozbawieniu nowych linii . Oto pytanie dotyczące tego, z niezwykle dokładną odpowiedzią: stackoverflow.com/questions/27872069/... To było jak trzygodzinna tajemnicza trasa.
aliteralmind,
8
Warto również zauważyć: w Unix i Linux Stack Exchange zaakceptowana odpowiedź na pytanie, jak dodawać nowe linie przy użyciu echa
Graham Perrin
@GrahamPerrin, dzięki za link do bardzo dobrej i szczegółowej odpowiedzi! Myślę, że to lepsze niż poniższe odpowiedzi.
Konstantin
2
echo -ne "hello \ nworld" (potrzebowałeś flagi n do interpretacji znaków ucieczki) - ale jak mówią inni, różne polecenia echa mogą mieć różne wyniki!
Konchog

Odpowiedzi:

2873

Zamiast printftego możesz użyć :

printf "hello\nworld\n"

printfma bardziej spójne zachowanie niż echo. Zachowanie echoróżni się znacznie między różnymi wersjami.

coś
źródło
49
a nawet printf %"s\n" hello world- printf ponownie użyje formatu, jeśli podano zbyt wiele argumentów
glenn jackman
28
OP zapytał o echo, a nie printf; a odpowiedź @ choroba poniżej, która korzysta z opcji -e, doskonale wypełnia rachunek.
JESii
57
@JESii: To pasuje, jeśli echozdarza ci się wspierać tę -eopcję.
sth
11
Z niektórymi wersjami echo, -ejest po prostu drukowany w samym wyjściu, więc myślę, że ta odpowiedź jest całkowicie poprawna, ponieważ echotutaj nie jest spójna (chyba że mówimy o konkretnej wersji).
Tejas Manohar,
14
Jest to dobre i dobre, jeśli printf jest dostępny, ale w przeciwieństwie do echa, czasami printf nie jest w dystrybucji.
bigtunacan,
1711

Czy jesteś pewien, że jesteś bash? Działa dla mnie na wszystkie cztery sposoby:

echo -e "Hello\nworld"
echo -e 'Hello\nworld'
echo Hello$'\n'world
echo Hello ; echo world
choroba
źródło
368
-e flaga zrobiła to dla mnie, co „umożliwia interpretację ucieczek odwrotnego ukośnika”
tandy,
21
Myślę, że -eparam nie istnieje na wszystkich systemach operacyjnych * nix
kenorb,
12
@kenorb: Istnieje w bash. To jest wbudowane.
choroba
Dlaczego trzeci działa? Bez $ zwraca „Hello n world”
Evan Donovan
21
Jak wspomniano przez różne inne -e NIE działa dla wszystkich dystrybucji i wersji. W niektórych przypadkach jest ignorowany, aw innych zostanie faktycznie wydrukowany. Nie wierzę, że to naprawiło to dla OP, więc nie należy przyjmować odpowiedzi
csga5000 15.04.16
578
echo $'hello\nworld'

odciski

hello
world

$''ciągi wykorzystują cytowanie ANSI C :

Słowa formularza są traktowane specjalnie. Słowo jest interpretowane jako ciąg znaków , a znaki specjalne z odwrotnym ukośnikiem są zastępowane zgodnie ze standardem ANSI C.$'string'

Vanuan
źródło
15
@EvgeniSergeev Nie jestem pewien, co masz na myśli, ale dla mnie to też nie zadziałało. A to dlatego, że używałem podwójnych cudzysłowów i okazuje się, że działa to tylko z pojedynczymi cudzysłowami! Próbowałem w Terminalu na Macu.
trss
11
Problemy ze zmiennymi w ciągu nie są rozwijane.
willemdh
Nadal możesz łączyć ciągi podwójnego cudzysłowu. `foo =" bar "; echo $ '' $ foo'efoot ''
Kamafeather
141

Zawsze możesz to zrobić echo "".

na przykład

echo "Hello"
echo ""
echo "World"
Nayeem Zen
źródło
6
echo ""działa dla mnie i myślę, że jest to najprostsza forma do wydrukowania nowej linii, nawet jeśli nie odpowiada to bezpośrednio na pytanie. Twoje zdrowie.
Mario Awad
2
Myślę, że jest to mniej oczywiste (a przez to potencjalnie bardziej mylące) niż echo -en "\n".
DBedrenko
72
echowystarczy uzyskać pusty wiersz
ROMANIA_inżynier
5
@Okneloper działa dobrze dla mnie.
Mateusz
71

Próbować

echo -e "hello\nworld"
hello
world

pracował dla mnie w nanoedytorze.

Ze strony podręcznika:

-e umożliwić interpretację ucieczek odwrotnego ukośnika

Harsha Biyani
źródło
41

Jeśli nie masz szans, że ktoś uderzy głową o ścianę, próbując dowiedzieć się, dlaczego skrypt współpracownika nie drukuje nowych linii, wypatruj tego ->

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

echo $(GET_RECORDS);

Tak jak powyżej, faktyczne uruchomienie metody może być samo zawinięte w echo, które zastępuje wszelkie echa, które mogą występować w samej metodzie. Oczywiście rozwodniłem to dla zwięzłości, nie było tak łatwo to zauważyć!

Następnie możesz poinformować towarzyszy, że lepszy byłby sposób wykonywania funkcji:

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

GET_RECORDS;
Wujek Iroh
źródło
Upewnij się, że zawijasz zmienną cudzysłowami przed wysłaniem jej z metody.
ingyhere
23

To działa dla mnie w języku Raspbian,

echo -e "hello\\nworld"
Sathesh
źródło
2
Działa też dla mnie w GitBash na Windows 7 ;-)
Big Rich
3
Pojedynczy ukośnik powinien wystarczyć
Felix D.
23

POSIX 7 na echo

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

-e nie jest zdefiniowany, a ukośniki odwrotne są zdefiniowane jako implementacja:

Jeśli pierwszym operandem jest -n lub jeśli którykolwiek z operandów zawiera znak <backlash>, wyniki są zdefiniowane w implementacji.

chyba że masz opcjonalne rozszerzenie XSI.

Zalecam więc użycie printfzamiast tego, co jest dobrze określone:

operand formatu należy wykorzystać jako ciąg formatu opisany w notacji formatu pliku XBD [...]

Oznaczenia Format pliku :

\ n <nowa linia> Przenieś pozycję drukowania na początek następnego wiersza.

Pamiętaj również, że Ubuntu 15.10 i większość dystrybucji implementuje echooba jako:

  • wbudowane Bash: help echo
  • samodzielny plik wykonywalny: which echo

co może prowadzić do zamieszania.

Ciro Santilli
źródło
17

Po prostu wpisz

echo

uzyskać nową linię

R Słońce
źródło
3
Zdecydowanie niedoceniana odpowiedź, nie mogę uwierzyć, że to pytanie zgromadziło ponad 20 odpowiedzi od 2011 roku i że żadna z nich nie zawiera tego prostego rozwiązania.
Prometeusz,
alias c = 'echo; Echo ; Echo ; Echo ; Echo ; Echo ; Echo ; Echo ; Echo ; Echo ; Echo ; Echo ; Echo ; Echo ; Echo ; Echo ; Echo ; Echo ; Echo ; Echo ; Echo ; Echo ; Echo ; Echo ; Echo ; Echo ; Echo ; Echo ; Echo ; Echo ; Echo ; Echo ; Echo ; Echo ; Echo ; Echo ;' To jedyny sposób, aby wyczyścić ekran, dzięki!
Ahi Tuna,
@Ahi Tuna: Zamiast tego użyj skrótów klawiaturowych na konsoli :)
R Nd
@RSun i jak mam to zrobić w oknie terminalu Debiana na Chromebooku?
Ahi Tuna,
1
@AhiTuna wyczyść; lub ctrl + 1;
Mike Seeds
16
str='hello\nworld'
$ echo | sed "i$str"
hello
world
Alinsoar
źródło
To jest naprawdę świetna odpowiedź, ponieważ działa na konkatenacje ciągów. Świetny!
LavaScornedOven
1
Po co zawracać sobie głowę wywołaniem drugiego programu? Nie chodzi o to, że próbujemy napisać aplikację bash w czasie rzeczywistym;), ale nie jest to konieczne.
Felix D.
to naprawdę świetna odpowiedź, która powinna działać wszędzie, bez względu na wszystko. Uratowałeś mojego przyjaciela @alinsoar
Kashyap Kotak
8

Działa dla mnie w CentOS:

echo -e ""hello\nworld""
vanishedzhou
źródło
6

Możesz także:

echo "hello
world"

Działa to zarówno w skrypcie, jak i z wiersza poleceń.
W wierszu polecenia naciśnij Shift+Enter aby wykonać podział wiersza w ciągu.

Działa to na moim systemie macOS i Ubuntu 18.04

vinzee
źródło
Jak wpisać ten podział wiersza bez konieczności uruchamiania polecenia przez powłokę po naciśnięciu klawisza Ènter`?
Xenos
@Xenos Działa to dobrze w skrypcie. W konsoli wystarczy kliknąć Shift + Enter, aby dodać nowy wiersz, aby uniknąć konieczności wykonywania przez powłokę niedokończonego polecenia.
vinzee,
5

Jeszcze jeden wpis dla tych, którzy nie sprawili, że działał z żadnym z tych rozwiązań, i muszą uzyskać wartość zwrotną z ich funkcji:

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

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

Tylko ta sztuczka działała w systemie Linux, nad którym pracowałem z tym bash:

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

Mam nadzieję, że pomoże to komuś z podobnym problemem.

DNT
źródło
4

Mój skrypt:

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

Wynik:

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

Na moim skrypcie bash oszalałam jak ty, dopóki nie spróbowałam:

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

Po prostu naciśnij enter, w którym chcesz wstawić ten skok. Wyjście to:

WARNING : 2 WARNINGS FOUND:
Warning, found the following local orphaned signature file:
TanisDLJ
źródło
4
Tylko uwaga, prawdopodobnie będziesz chciał użyć $ {} wokół nazw zmiennych, ponieważ to nie może prowadzić do naprawdę dziwnego zachowania, gdy powłoka znajdzie zmienną o nazwie $ warningsFound i wydrukuje to, a nie dwa oddzielne wyjścia.
dragon788
@ dragon788 może coś mi brakuje, ale zmienna faktycznie nazywa się $ warningsFound?
psynnott,
2
Brakowało mi słowa na ten temat. Jeśli masz zmienną o nazwie $ ostrzeżenia, w niektórych przypadkach bez użycia $ {warningsFound}, potencjalnie możesz skończyć z zawartością $ ostrzeżeń + „Znaleziono” zamiast zamierzonej zmiennej.
dragon788
3

Możesz także użyć echa z nawiasami klamrowymi,

$ (echo hello; echo world)
hello
world
Avinash Raj
źródło
błąd składni w pobliżu nieoczekiwanego tokena `('po wywołaniu w pliku
.sh
1
spróbujecho hello; echo world
Avinash Raj
1
Lub „echo hello && echo world” lub po prostu: „echo hello echo world
csga5000 15.04.16
3

Można to lepiej zrobić jako

x="\n"
echo -ne $x

-e opcja interpretuje odwrotne ukośniki dla sekwencji ucieczki
-n opcja usuwa końcowy znak nowej linii na wyjściu

PS: echo polecenia zawsze włącza znak wyjściowy nowej linii, więc -n jest wymagane, aby wyłączyć tę rzecz (i zmniejszyć jej zamieszanie)

Dhwanit
źródło
echo -ne "hello \ nworld" dla dokładnej odpowiedzi na pytanie :)
Dhwanit
3

Jest nowy rozszerzenie parametr dodaje się bash 4.4, że sekwencje interpretuje ewakuacji:

${parameter@operator} - E operator

Rozwinięcie jest łańcuchem będącym wartością parametru z sekwencjami ucieczki odwrotnego ukośnika rozwiniętymi jak w przypadku $'…'mechanizmu cytowania.

$ foo='hello\nworld'
$ echo "${foo@E}"
hello
world
Pesa The
źródło
2

Jeśli piszesz skrypty i kilka razy będziesz powtarzał nowe wiersze jako część innych wiadomości, fajnym rozwiązaniem dla wielu platform jest umieszczenie dosłownego nowego wiersza w zmiennej takiej jak:

newline='
'

echo "first line$newlinesecond line"
echo "Error: example error message n${newline}${usage}" >&2 #requires usage to be defined
chichot
źródło
0

Czasami możesz przekazać wiele ciągów znaków oddzielonych spacją i będzie to interpretowane jako \n.

Na przykład podczas korzystania ze skryptu powłoki do powiadomień wieloliniowych:

#!/bin/bash
notify-send 'notification success' 'another line' 'time now '`date +"%s"`
Łowca Frazier
źródło
To jest niepoprawne. Nigdy nie jest interpretowane jako \n. Jest interpretowany jako osobny argument dla programu, a sam program może wyświetlać ten argument w nowym wierszu, ale to nie znaczy, że został przekonwertowany \nna dowolny punkt i jest całkowicie zależny od programu.
Score_Under
0

Musiałem otoczyć tekst podwójnymi cudzysłowami, używając jako aliasu w profilu bash (MacOx, iTerm).

alias helloworld="echo -e \"hello \n world\""
John Jai
źródło
0

To mnie tam doprowadziło ....

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

Wydajność:

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]
Joe Healy
źródło
-1

Po prostu używam echa bez argumentów

echo "Hello"
echo
echo "World"
Ksenon
źródło
-2

Dodatkowe rozwiązanie:

W niektórych przypadkach musisz wyświetlić echo multilinii długich treści (takich jak kod / konfiguracje)

Na przykład :

  • Skrypt Bash do generowania kodów / konfiguracji

echo -e, printfmoże mieć pewne ograniczenia

Możesz użyć specjalnego znaku jako symbolu zastępczego jako podziału wiersza (np. ~) I zastąpić go po utworzeniu pliku za pomocątr

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

musi wywołać inny program ( tr), który powinien być w porządku IMO.

ZenithS
źródło