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.


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.


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

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'


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"

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


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;

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"

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.


17

Po prostu wpisz

echo

uzyskać nową linię


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

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


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


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.


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:

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

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)


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

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

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"`

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\""

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]

-1

Po prostu używam echa bez argumentów

echo "Hello"
echo
echo "World"

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.