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.
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:
-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
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'
@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 ''
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".
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/bashfunction 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/bashfunction GET_RECORDS(){
echo -e "starting\n the process";}
GET_RECORDS;
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.
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
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.
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.
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
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
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).
Odpowiedzi:
Zamiast
printf
tego możesz użyć :printf
ma bardziej spójne zachowanie niżecho
. Zachowanieecho
różni się znacznie między różnymi wersjami.źródło
printf %"s\n" hello world
- printf ponownie użyje formatu, jeśli podano zbyt wiele argumentówecho
zdarza ci się wspierać tę-e
opcję.echo
,-e
jest po prostu drukowany w samym wyjściu, więc myślę, że ta odpowiedź jest całkowicie poprawna, ponieważecho
tutaj nie jest spójna (chyba że mówimy o konkretnej wersji).Czy jesteś pewien, że jesteś bash? Działa dla mnie na wszystkie cztery sposoby:
źródło
-e
param nie istnieje na wszystkich systemach operacyjnych * nixodciski
$''
ciągi wykorzystują cytowanie ANSI C :źródło
Zawsze możesz to zrobić
echo ""
.na przykład
źródło
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.echo -en "\n"
.echo
wystarczy uzyskać pusty wierszPróbować
pracował dla mnie w
nano
edytorze.Ze strony podręcznika:
źródło
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 ->
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:
źródło
To działa dla mnie w języku Raspbian,
źródło
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:chyba że masz opcjonalne rozszerzenie XSI.
Zalecam więc użycie
printf
zamiast tego, co jest dobrze określone:Oznaczenia Format pliku :
Pamiętaj również, że Ubuntu 15.10 i większość dystrybucji implementuje
echo
oba jako:help echo
which echo
co może prowadzić do zamieszania.
źródło
Po prostu wpisz
uzyskać nową linię
źródło
źródło
Działa dla mnie w CentOS:
źródło
Możesz także:
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
źródło
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:
Tylko ta sztuczka działała w systemie Linux, nad którym pracowałem z tym bash:
Mam nadzieję, że pomoże to komuś z podobnym problemem.
źródło
Mój skrypt:
Wynik:
Na moim skrypcie bash oszalałam jak ty, dopóki nie spróbowałam:
Po prostu naciśnij enter, w którym chcesz wstawić ten skok. Wyjście to:
źródło
Możesz także użyć echa z nawiasami klamrowymi,
źródło
echo hello; echo world
Można to lepiej zrobić jako
-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)
źródło
Jest nowy rozszerzenie parametr dodaje się
bash 4.4
, że sekwencje interpretuje ewakuacji:źródło
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:
źródło
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:
źródło
\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\n
na dowolny punkt i jest całkowicie zależny od programu.Musiałem otoczyć tekst podwójnymi cudzysłowami, używając jako aliasu w profilu bash (MacOx, iTerm).
źródło
To mnie tam doprowadziło ....
Wydajność:
źródło
Po prostu używam echa bez argumentów
źródło
Dodatkowe rozwiązanie:
W niektórych przypadkach musisz wyświetlić echo multilinii długich treści (takich jak kod / konfiguracje)
Na przykład :
echo -e
,printf
może mieć pewne ograniczeniaMożesz użyć specjalnego znaku jako symbolu zastępczego jako podziału wiersza (np.
~
) I zastąpić go po utworzeniu pliku za pomocątr
musi wywołać inny program (
tr
), który powinien być w porządku IMO.źródło