Rozwiązaniem jest użycie $'string'
na przykład:
$ STR=$'Hello\nWorld'
$ echo "$STR" # quotes are required here!
Hello
World
Oto fragment strony podręcznika Bash:
Words of the form $'string' are treated specially. The word expands to
string, with backslash-escaped characters replaced as specified by the
ANSI C standard. Backslash escape sequences, if present, are decoded
as follows:
\a alert (bell)
\b backspace
\e
\E an escape character
\f form feed
\n new line
\r carriage return
\t horizontal tab
\v vertical tab
\\ backslash
\' single quote
\" double quote
\nnn the eight-bit character whose value is the octal value
nnn (one to three digits)
\xHH the eight-bit character whose value is the hexadecimal
value HH (one or two hex digits)
\cx a control-x character
The expanded result is single-quoted, as if the dollar sign had not
been present.
A double-quoted string preceded by a dollar sign ($"string") will cause
the string to be translated according to the current locale. If the
current locale is C or POSIX, the dollar sign is ignored. If the
string is translated and replaced, the replacement is double-quoted.
STR=$"Hello\nWorld"
po prostu drukujeHello\nWorld
.H="Hello"; W="World"; STR="${H}"$'\n'"${W}"; echo "${STR}"
rozlegnie się echo „Hello” i „World” w osobnych wierszachEcho ma tak lata dziewięćdziesiąte i jest tak pełne niebezpieczeństw, że jego użycie powinno doprowadzić do zrzutów rdzenia nie mniej niż 4 GB. Poważnie, problemy echa były przyczyną, dla której proces standaryzacji Unixa w końcu wymyślił
printf
narzędzie, usuwając wszystkie problemy.Aby uzyskać nowy wiersz w ciągu:
Tam! Bez szaleństwa echa SYSV vs BSD, wszystko jest ładnie wydrukowane iw pełni przenośne wsparcie dla sekwencji ucieczki C. Proszę, skorzystajcie
printf
teraz i nigdy nie oglądajcie się za siebie.źródło
$'string'
jest jeszcze czystsze.$'foo'
Składnia jest niepoprawna składnia POSIX jako 2013. Wiele muszli będą narzekać.BAR=$(printf "hello\nworld\n")
nie drukuje końcowego \ n dla mnie$()
jest określony przez POSIX jako usuwanie sekwencji jednego lub więcej <newline> znaków na końcu podstawienia .To, co zrobiłem na podstawie innych odpowiedzi, było
źródło
Problem nie dotyczy powłoki. Problem tkwi w
echo
samej komendzie i braku podwójnych cudzysłowów wokół interpolacji zmiennej. Możesz spróbować użyć,echo -e
ale nie jest to obsługiwane na wszystkich platformach, a jeden z powodówprintf
jest teraz zalecany dla przenośności.Możesz także spróbować wstawić nowy wiersz bezpośrednio do skryptu powłoki (jeśli skrypt jest tym, co piszesz), aby wyglądał jak ...
lub równoważnie
źródło
Uważam, że
-e
flaga jest elegancka i prostaJeśli ciąg jest wynikiem innego polecenia, po prostu używam cudzysłowów
źródło
echo
.echo -e
jest znany ze swoich problemów związanych z przenośnością. Obecnie jest to mniej sytuacja na Dzikim Zachodzie niż w wersji sprzed POSIX, ale nadal nie ma powodu, aby preferowaćecho -e
. Zobacz także stackoverflow.com/questions/11530203/…Jedyną prostą alternatywą jest wpisanie nowego wiersza w zmiennej:
Tak, oznacza to pisanie w Enterrazie potrzeby w kodzie.
Istnieje kilka odpowiedników
new line
postaci.Ale wszystkie wymagają „interpretacji” przez jakieś narzędzie ( POSIX printf ):
Dlatego narzędzie jest wymagane do zbudowania łańcucha z nową linią:
W niektórych powłokach sekwencja $'jest specjalnym rozszerzeniem powłoki. Znany do pracy w ksh93, bash i zsh:
Oczywiście możliwe są również bardziej złożone rozwiązania:
Lub
źródło
$ Tuż przed pojedynczymi cudzysłowami „... \ n ...” w następujący sposób, jednak podwójne cudzysłowy nie działają.
źródło
Nie jestem ekspertem od bash, ale ten działał dla mnie:
Ułatwiło mi to formatowanie tekstów.
źródło
$NEWSTR
miejscuecho "$NEWSTR"
są tutaj ważneW moim systemie (Ubuntu 17.10) twój przykład działa tak, jak chcesz, zarówno po wpisaniu z linii poleceń (do
sh
), jak i po uruchomieniu jakosh
skrypt:Myślę, że to odpowiada na twoje pytanie: to po prostu działa. (Nie próbowałem dowiedzieć się szczegółów, takich jak na jakim dokładnie momencie zastąpienia znak nowej linii dla
\n
zdarza sięsh
).Jednak zauważyłem, że ten sam skrypt będzie zachowywać się inaczej, gdy wykonywane z
bash
i będzie drukowaćHello\nWorld
zamiast:Udało mi się uzyskać pożądany wynik
bash
w następujący sposób:Zwróć uwagę na podwójne cytaty wokół
$STR
. To zachowuje się identycznie, jeśli zostanie zapisane i uruchomione jakobash
skrypt.Poniższe daje również pożądany wynik:
źródło
Ci wybredni, którzy potrzebują tylko nowej linii i gardzą kodem wieloliniowym, który łamie wcięcia, mogą zrobić:
Bash (i prawdopodobnie inne powłoki) pożerają wszystkie końcowe znaki nowej linii po podstawieniu polecenia, więc musisz zakończyć
printf
ciąg znakiem innym niż znak nowej linii, a następnie go usunąć. Może to również łatwo stać się oneliner.źródło
Nie byłam zadowolona z żadnej z dostępnych tu opcji. To działało dla mnie.
źródło
str=$(printf '%s\n' "first line" "another line" "and another line")
(powłoka wygodnie (lub nie) przycina wszelkie końcowe znaki nowej linii z podstawiania poleceń). Kilka odpowiedzi tutaj już promuje sięprintf
w różnych formach, więc nie jestem pewien, czy stanowi to wartość dodaną jako osobna odpowiedź.printf '%s\n' "first line" \
(nowa linia, wcięcie)'second line'
itp. Zobacz także, jakprintf -v str
przypisać zmienną bez odradzania podpowłoki.