echo
echo
Realizacja które ściśle zgodny z Single Unix Specification doda znaki nowej linii, jeśli zrobić:
echo 'line1\nline2'
Ale to nie jest wiarygodne zachowanie. W rzeczywistości nie ma żadnego standardowego zachowania, którego można by oczekiwać echo
.
OPERACJE
string
Ciąg do zapisania na standardowe wyjście. Jeśli pierwszym operandem jest -n
lub 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 \c
po 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 echo
wyjątkiem tego, że ogólnie możesz polegać tylko echo
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ć:
shopt -s xpg_echo
echo hey\\nthere
hey
there
I nawet to nie jest konieczne, jeśli bash
zostało zbudowane z opcją czasu kompilacji ...
--enable-xpg-echo-default
echo
Powoduje, że wbudowane rozszerzenie domyślnie rozwija znaki specjalne z odwrotnym ukośnikiem, nie wymagając -e
opcji. Powoduje to ustawienie domyślnej wartości xpg_echo
opcji powłoki na on
, dzięki czemu Bash echo
zachowuje się bardziej jak wersja określona w specyfikacji Single Unix, wersja 3. Zobacz Wbudowane wersje Bash , aby zapoznać się z opisem echo
rozpoznawalnych sekwencji ucieczki .
printf
Z drugiej strony printf
zachowanie jest dość oswojone w porównaniu.
RACJONALNE UZASADNIENIE
printf
Narzę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 echo
istniejących, wersja ma kilka specjalnych funkcji, pozostawiając je nowemu printf
narzę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 %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
.
printf ^%b%s$ '\n' '\n' '\t' '\t'
^
\n$^ \t$
Zobacz, dlaczego jest printf
lepszy niż echo
? po więcej.
echo() printf
Możesz napisać własne standardy zgodne z echo
...
echo(){
printf '%b ' "$@\n\c"
}
... 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:
echo()
case ${IFS- } in
(\ *) printf %b\\n "$*";;
(*) IFS=\ $IFS
printf %b\\n "$*"
IFS=${IFS#?}
esac
echo
obowiązkowe? możesz użyćprintf
.