Pytanie Echo newline w Bash drukuje dosłownie \ n


W Bash spróbował tego:

echo -e "hello\nworld"

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

Używam Ubuntu 11.04.


1579
2017-12-11 21:01


pochodzenie


Dla tych, którzy mówią "działa dla mnie", zachowanie echa różni się nieco między wersjami. Niektórzy nawet wypisują "-e" jako część swoich danych wyjściowych. Jeśli chcesz zachować przewidywalne zachowanie dla niczego nietrywialnego, użyj printf zamiast (jak w odpowiedzi @ sth). - Gordon Davisson
Nie mogłem dostać każdy sugestii w tej odpowiedzi działa, ponieważ, jak się okazało, próbowałem użyć go w funkcji, która zwraca wartość, a wszystkie komunikaty echo (i printf) w funkcji zostały dołączone do wartości zwracanej po indywidualnym pozbawieniu nowych linii. Oto pytanie na ten temat, z bardzo dokładną odpowiedzią: stackoverflow.com/questions/27872069/... To było jak trzygodzinna, tajemnicza trasa. - aliteralmind
Również godne uwagi: w Unix i Linux Stack Exchange, zaakceptowana odpowiedź do Jak dodawać nowe linie podczas używania echa - Graham Perrin
@GrahamPerrin, dziękuję za link do bardzo dobrej i szczegółowej odpowiedzi! Myślę, że to lepsze niż odpowiedzi poniżej. - Konstantin
echo -ne "hello \ nworld" (potrzebna była flaga n do interpretowania ucieczek) - ale, jak mówią inni, różne polecenia echa mogą mieć różne wyniki! - Konchog


Odpowiedzi:


Możesz użyć printf zamiast:

printf "hello\nworld\n"

printf ma bardziej spójne zachowanie niż echo. Zachowanie echo różni się znacznie w różnych wersjach.


1946
2017-12-11 21:04



lub nawet printf %"s\n" hello world - printf ponownie użyje formatu, jeśli podano zbyt wiele argumentów - glenn jackman
OP zapytał o echo, a nie printf; a odpowiedź @ choroby poniżej, która używa opcji -e, doskonale wypełnia rachunek. - JESii
@JESii: Pasuje, jeśli twój echo zdarza się wspierać -e opcja. - sth
W niektórych wersjach echo, -e jest właśnie drukowane w samym pliku wyjściowym, więc myślę, że ta odpowiedź jest doskonale ważna od tego czasu echo nie jest tutaj spójny (chyba, że ​​mówimy o konkretnej wersji). - Tejas Manohar
To jest dobre i dobre, jeśli printf jest dostępny, ale w przeciwieństwie do echa czasami printf nie znajduje się w dystrybucji. - bigtunacan


Jesteś pewien, że jesteś w bash? Działa dla mnie na wszystkie trzy sposoby:

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

1302
2017-12-11 21:04



-e flaga zrobiła to za mnie, co "umożliwia interpretację odwrotnych ukośników" - tandy
Myślę -e Parametr nie istnieje na wszystkich systemach * nix - kenorb
@kenorb: Istnieje w bash. Jest to wbudowane. - choroba
Dlaczego trzeci działa? Bez $ zwraca "Hello n world" - Evan Donovan
Jak wspomniano przez różne inne -e, NIE działa dla wszystkich dystrybucji i wersji. W niektórych przypadkach jest on ignorowany, aw innych zostanie wydrukowany. Nie wierzę, że to naprawiło to dla PO, więc nie powinno być akceptowanej odpowiedzi - csga5000


echo $'hello\nworld'

drukuje

hello
world

$'' używać ciągów ANSI C Cytowanie:

Słowa formy $'strunowy' są traktowane specjalnie. Słowo rozwija się do strunowy, z zastąpionymi znakami ukośnika odwróconego zgodnie z normą ANSI C.


424
2017-11-02 09:39



Czy to nie pracować dla kogokolwiek? Daj nam znać. - Evgeni Sergeev
@EvgeniSergeev Nie jestem pewien, co masz na myśli, ale to też nie zadziałało. A to dlatego, że używałem podwójnych cytatów i okazuje się, że działa to tylko z pojedynczymi cytatami! Próbowałem w Terminalu na Macu. - trss
Problemy z rozszerzaniem zmiennych w łańcuchu. - willemdh


Zawsze możesz to zrobić echo "".

na przykład

echo "Hello"
echo ""
echo "World"

90
2018-02-28 22:14



echo "" działa dla mnie i myślę, że jest to najprostsza forma drukowania nowej linii, nawet jeśli nie odpowiada to bezpośrednio na pytanie. Twoje zdrowie. - Mario Awad
Myślę, że to mniej oczywiste (i potencjalnie bardziej mylące) niż echo -en "\n". - DBedrenko
echo wystarczy, aby uzyskać pustą linię - ROMANIA_engineer
echo '' nie działa btw - Okneloper
@Okneloper działa dobrze dla mnie. - Matthew Read


Przy braku szansy, że ktoś uderzy głową o ścianę, próbując zrozumieć, dlaczego scenariusz współpracownika nie wydrukuje nowych linii, uważaj na to ->

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

echo $(GET_RECORDS);

Podobnie jak w powyższym, rzeczywiste działanie metody może samo być zawijane w echo, które zastępuje wszelkie echa, które mogą znajdować się w samej metodzie. Oczywiście podlewałem to dla zwięzłości, nie było tak łatwo zauważyć!

Następnie możesz poinformować swoich towarzyszy, że lepszy sposób na wykonanie funkcji będzie następujący:

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

GET_RECORDS;

33
2017-08-08 20:15



Upewnij się, że zawijasz zmienną za pomocą cudzysłowów, zanim wyjmiesz ją z metody. - ingyhere


Próbować

echo -e "hello\nworld"
hello
world

pracował dla mnie w edytorze nano.


22
2017-12-05 11:06





To działa dla mnie w raspbian,

echo -e "hello\\nworld"


18
2018-04-19 19:05



Działa również dla mnie w GitBash na Windows 7 ;-) - Big Rich
Pojedynczy ukośnik powinien wystarczyć - Felix D.
Minus jeden za powtórzenie już istniejącej odpowiedzi. - Piotr Dobrogost


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

14
2017-11-23 11:10



Jest to naprawdę świetna odpowiedź, ponieważ działa w przypadku konkatenacji ciągów. Wspaniały! - LavaScornedOven
Po co zawracać sobie głowę wywołaniem drugiego programu? Nie chodzi o to, że próbujemy napisać aplikację w czasie rzeczywistym w bashu;), 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


POSIX 7 na echo

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

-e nie jest zdefiniowany, a ukośniki odwrotne to implementacja zdefiniowana:

Jeśli pierwszy operand to -n lub jeśli którykolwiek z operandów zawiera znak <backslash>, wyniki są definiowane przez implementację.

chyba że masz opcjonalne rozszerzenie XSI.

Więc używaj printf zamiast:

Argument format będzie użyty jako ciąg formatujący opisany w XBD Format pliku Notacja [...]

Notacja w formacie pliku:

\ n <nowa linia> Ustaw pozycję drukowania na początku następnego wiersza.

Należy również pamiętać, że Ubuntu 15.10 i większość implementacji distros echo zarówno jako:

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

co może prowadzić do pewnego zamieszania.


14
2018-01-22 13:23





Jeszcze jeden wpis dla tych, którzy nie sprawiają, że działa on z żadnym z tych rozwiązań i muszą uzyskać wartość zwracaną 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 Linuksie, nad którym pracowałem z tym bash:

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

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


4
2018-01-31 14:20





Mój skrypt:

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

Wydajność:

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

W moim skrypcie basha szalałem tak długo, jak tylko próbowałem:

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

Po prostu naciśnij Enter, gdzie chcesz wstawić ten skok. Wyjście to teraz:

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

3
2018-05-14 08:58



Tylko jedna uwaga, prawdopodobnie będziesz chciał użyć $ {} wokół swoich nazw zmiennych, ponieważ nie robi tego, może prowadzić do dziwnego zachowania, gdy powłoka znajdzie zmienną o nazwie $ warningsFound i wydrukuje ją, a nie dwa osobne wyjścia. - dragon788
@ Dragon788 może czegoś brakuje, ale zmienna IS nazywa się w rzeczywistości $ warningsFound? - psynnott
Brakowało mi słowa na ten temat. Jeśli masz zmienną o nazwie $ ostrzeżenia, w niektórych przypadkach bez użycia $ {warningsFound}, możesz potencjalnie skończyć z zawartością ostrzeżeń $ + "Znalezione" zamiast zamierzonej zmiennej. - dragon788