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.
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.
Odpowiedzi:
Zamiast printf
tego możesz użyć :
printf "hello\nworld\n"
printf
ma bardziej spójne zachowanie niż echo
. Zachowanie echo
różni się znacznie między różnymi wersjami.
printf %"s\n" hello world
- printf ponownie użyje formatu, jeśli podano zbyt wiele argumentów
echo
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:
echo -e "Hello\nworld"
echo -e 'Hello\nworld'
echo Hello$'\n'world
echo Hello ; echo world
-e
param nie istnieje na wszystkich systemach operacyjnych * nix
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'
Zawsze możesz to zrobić echo ""
.
na przykład
echo "Hello"
echo ""
echo "World"
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 wiersz
Próbować
echo -e "hello\nworld"
hello
world
pracował dla mnie w nano
edytorze.
Ze strony podręcznika:
-e
umożliwić interpretację ucieczek odwrotnego ukośnika
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;
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 printf
zamiast tego, co jest dobrze określone:
operand formatu należy wykorzystać jako ciąg formatu opisany w notacji formatu pliku XBD [...]
\ 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 echo
oba jako:
help echo
which echo
co może prowadzić do zamieszania.
Po prostu wpisz
echo
uzyskać nową linię
str='hello\nworld'
$ echo | sed "i$str"
hello
world
Działa dla mnie w CentOS:
echo -e ""hello\nworld""
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
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.
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:
Możesz także użyć echa z nawiasami klamrowymi,
$ (echo hello; echo world)
hello
world
echo hello; echo world
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)
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
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"`
\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.
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]
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 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.