Nie wiedziałem o printf, z printf to działa: P ... więc co sprawia, że nie działa z echo?
Saeid Yazdani
Czy \rzawiera w wyjściu lub jest częścią CRLFnowego wiersza?
cuonglm
9
Istnieje wiele różnych implementacji echopoleceń niezgodnych ze sobą. Dlatego zaleca się stosowanie bardziej standardowego narzędzia jako printf. Zobacz unix.stackexchange.com/questions/65803/…, aby uzyskać rozszerzony przegląd problemu.
Ciąg do zapisania na standardowe wyjście. Jeśli pierwszym operandem jest -nlub jeśli którykolwiek z operandów zawiera znak < \odwrotny ukośnik> , wyniki są zdefiniowane w implementacji .
W systemach zgodnych z XSI , jeśli pierwszym operandem jest -n, należy go traktować jako ciąg, a nie opcję . Następujące sekwencje znaków należy rozpoznać w systemach zgodnych z XSI w ramach jednego z argumentów:
\a- Napisz <alert> .
\b- Napisz <backspace> .
\c- Pomiń <nową linię >, która w przeciwnym razie następuje po ostatnim argumencie w danych wyjściowych. Wszystkie znaki następujące \cpo argumentach zostaną zignorowane.
\f- Napisz <feed-feed> .
\n- Napisz < nową linię > .
\r- Napisz <powrót karetki> .
\t- Napisz <tab> .
\v- Napisz <tabertę> .
\\- Wpisz znak <lashlash> .
\0num- Napisz 8-bitową wartość, która jest zerową, jedną, dwiema lub trzycyfrowymi liczbami ósemkowymi num.
Tak więc naprawdę nie ma żadnego ogólnego sposobu, aby wiedzieć, jak napisać nowy wiersz, z echowyjątkiem tego, że ogólnie możesz polegać tylko echona zrobieniu tego.
bashPowłoki zazwyczaj nie nie są zgodne ze specyfikacją i obsługuje -ni inne opcje, ale nawet to nie jest pewne. Możesz to zrobić:
shopt -s xpg_echo
echo hey\\nthere
hey
there
I nawet to nie jest konieczne, jeśli bashzostało zbudowane z opcją czasu kompilacji ...
echoPowoduje, że wbudowane rozszerzenie domyślnie rozwija znaki specjalne z odwrotnym ukośnikiem, nie wymagając -eopcji. Powoduje to ustawienie domyślnej wartości xpg_echoopcji powłoki na on, dzięki czemu Bash echozachowuje się bardziej jak wersja określona w specyfikacji Single Unix, wersja 3. Zobacz Wbudowane wersje Bash , aby zapoznać się z opisem echorozpoznawalnych sekwencji ucieczki .
printf
Z drugiej strony printfzachowanie jest dość oswojone w porównaniu.
printfNarzędzie dodano w celu zapewnienia funkcji, które w przeszłości były dostarczone przez echo. Jednak z powodu niemożliwych do pogodzenia różnic w różnych wersjach echoistniejących, wersja ma kilka specjalnych funkcji, pozostawiając je nowemu printfnarzędziu, które jest oparte na jednym w systemie Dziewiątej Edycji.
Sekcja ROZSZERZONY OPIS prawie dokładnie odpowiada printf()funkcji w standardzie ISO C, chociaż jest opisana w kategoriach zapisu formatu pliku w zapisie formatu pliku XBD .
Obsługuje ciągi formatujące, które opisują jego argumenty - może to być dowolna liczba rzeczy, ale dla ciągów są to %bwłaściwie ciągi yte lub ciągi dosłowne %s. Poza %formatami w pierwszym argumencie, zachowuje się on najbardziej jak %bargument w postaci łańcucha yte, z tym wyjątkiem, że nie obsługuje zmiany znaczenia \c.
Fajna prosta opcja „-e”, aby uruchomić sekwencje specjalne - mówi na innej odpowiedzi, która echojest niewiarygodna i nie spełnia standardów w przeciwieństwie do printf.
Edward,
1
Upewnij się, że skrypt nie zawiera żadnych literałów \ r \ n, na przykład w tr -d "\n"poleceniu.
Noumenon
8
We wszystkich wersjach basha, których użyłem, możesz po prostu wstawić dosłownie nowy wiersz w ciągu albo interaktywnie, albo w skrypcie, pod warunkiem, że napis jest wystarczająco cytowany.
echo
obowiązkowe? możesz użyćprintf
.\r
zawiera w wyjściu lub jest częściąCRLF
nowego wiersza?echo
poleceń niezgodnych ze sobą. Dlatego zaleca się stosowanie bardziej standardowego narzędzia jakoprintf
. Zobacz unix.stackexchange.com/questions/65803/…, aby uzyskać rozszerzony przegląd problemu.Odpowiedzi:
echo
echo
Realizacja które ściśle zgodny z Single Unix Specification doda znaki nowej linii, jeśli zrobić:Ale to nie jest wiarygodne zachowanie. W rzeczywistości nie ma żadnego standardowego zachowania, którego można by oczekiwać
echo
.Tak więc naprawdę nie ma żadnego ogólnego sposobu, aby wiedzieć, jak napisać nowy wiersz, z
echo
wyjątkiem tego, że ogólnie możesz polegać tylkoecho
na zrobieniu tego.bash
Powłoki zazwyczaj nie nie są zgodne ze specyfikacją i obsługuje-n
i inne opcje, ale nawet to nie jest pewne. Możesz to zrobić:I nawet to nie jest konieczne, jeśli
bash
zostało zbudowane z opcją czasu kompilacji ...printf
Z drugiej strony
printf
zachowanie jest dość oswojone w porównaniu.Obsługuje ciągi formatujące, które opisują jego argumenty - może to być dowolna liczba rzeczy, ale dla ciągów są to
%b
właściwie ciągi yte lub ciągi dosłowne%s
. Poza%f
ormatami w pierwszym argumencie, zachowuje się on najbardziej jak%b
argument w postaci łańcucha yte, z tym wyjątkiem, że nie obsługuje zmiany znaczenia\c
.Zobacz, dlaczego jest
printf
lepszy niżecho
? po więcej.echo() printf
Możesz napisać własne standardy zgodne z
echo
...... który właściwie powinien zawsze robić właściwe rzeczy automatycznie.
Właściwie nie ... To wypisuje literał
\n
na końcu argumentów, jeśli ostatni argument kończy się nieparzystą liczbą <backlashes> .Ale to nie:
źródło
shopt -s xpg_echo
opcję domyślnieecho
używaną-e
.-e
. Dziwi mnie, że nikt tego nie zauważył, chyba że @HaydeSchiffPrzekaż flagę -e, aby wyświetlić echo, aby przeanalizować znaki specjalne, takie jak „\ r \ n”, na przykład:
źródło
echo
jest niewiarygodna i nie spełnia standardów w przeciwieństwie doprintf
.tr -d "\n"
poleceniu.We wszystkich wersjach basha, których użyłem, możesz po prostu wstawić dosłownie nowy wiersz w ciągu albo interaktywnie, albo w skrypcie, pod warunkiem, że napis jest wystarczająco cytowany.
Interaktywnie:
W skrypcie:
źródło
dalsze możliwości zastosowania:
źródło
Ludzie już odpowiedzieli odpowiednio, ale ja nie akceptuję świata, w którym echo akceptuje każdą opcję inną niż
-n
.źródło
Jeśli masz znak, który nie jest częścią wiadomości, możesz przepuścić przez sed
źródło