Solusinya adalah menggunakan $'string'
, misalnya:
$ STR=$'Hello\nWorld'
$ echo "$STR" # quotes are required here!
Hello
World
Berikut ini kutipan dari halaman manual 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"
cukup cetakHello\nWorld
.H="Hello"; W="World"; STR="${H}"$'\n'"${W}"; echo "${STR}"
akan menggemakan "Halo" dan "Dunia" pada baris yang terpisahEcho begitu berusia sembilan puluhan dan penuh dengan bahaya sehingga penggunaannya akan menghasilkan dump inti tidak kurang dari 4GB. Serius, masalah gema adalah alasan mengapa proses Standarisasi Unix akhirnya menemukan
printf
utilitas, menghilangkan semua masalah.Jadi untuk mendapatkan baris baru dalam sebuah string:
Sana! Tidak ada SYSV vs BSD, kegilaan gema, semuanya dicetak dengan rapi dan dukungan sepenuhnya portabel untuk urutan pelarian C. Semua orang silakan gunakan
printf
sekarang dan jangan pernah melihat ke belakang.sumber
$'string'
lebih bersih.$'foo'
sintaks tidak sintaks POSIX berlaku sejak 2013. Banyak kerang akan mengeluh.BAR=$(printf "hello\nworld\n")
tidak mencetak trailing \ n untuk saya$()
ditentukan oleh POSIX sebagai menghapus urutan satu atau lebih karakter <newline> di akhir substitusi .Apa yang saya lakukan berdasarkan jawaban yang lain adalah
sumber
Masalahnya bukan pada shell. Masalahnya sebenarnya dengan
echo
perintah itu sendiri, dan kurangnya tanda kutip ganda di sekitar interpolasi variabel. Anda dapat mencoba menggunakanecho -e
tetapi itu tidak didukung pada semua platform, dan salah satu alasanprintf
sekarang direkomendasikan untuk portabilitas.Anda juga dapat mencoba dan menyisipkan baris baru langsung ke skrip shell Anda (jika skrip adalah apa yang Anda tulis) sehingga terlihat seperti ...
atau setara
sumber
Saya menemukan
-e
bendera yang elegan dan lurus ke depanJika string adalah output dari perintah lain, saya hanya menggunakan tanda kutip
sumber
echo
.echo -e
terkenal karena masalah portabilitasnya. Ini kurang dari situasi Wild West sekarang daripada pra-POSIX, tetapi masih belum ada alasan untuk memilihecho -e
. Lihat juga stackoverflow.com/questions/11530203/…Satu-satunya alternatif sederhana adalah mengetikkan baris baru di variabel:
Ya, itu artinya menulis Enter mana diperlukan dalam kode.
Ada beberapa padanan dengan
new line
karakter.Tetapi semua itu membutuhkan "interpretasi" oleh beberapa alat ( POSIX printf ):
Dan karena itu, alat ini diperlukan untuk membangun string dengan baris baru:
Dalam beberapa shell, urutannya $'adalah ekspansi shell khusus. Dikenal bekerja di ksh93, bash, dan zsh:
Tentu saja, solusi yang lebih kompleks juga dimungkinkan:
Atau
sumber
A $ tepat sebelum tanda kutip tunggal '... \ n ...' sebagai berikut, namun tanda kutip ganda tidak berfungsi.
sumber
Saya bukan pakar bash, tetapi yang ini bekerja untuk saya:
Saya menemukan ini lebih mudah untuk memformat teks.
sumber
$NEWSTR
dalamecho "$NEWSTR"
sangat penting di siniPada sistem saya (Ubuntu 17.10) contoh Anda hanya berfungsi seperti yang diinginkan, baik ketika diketik dari baris perintah (ke
sh
) dan ketika dieksekusi sebagaish
skrip:Saya kira ini menjawab pertanyaan Anda: itu hanya berfungsi. (Saya belum mencoba mencari tahu detail seperti kapan tepatnya penggantian karakter baris baru
\n
terjadi dish
).Namun, saya perhatikan bahwa skrip yang sama ini akan berperilaku berbeda ketika dieksekusi dengan
bash
dan akan dicetakHello\nWorld
sebagai gantinya:Saya sudah berhasil mendapatkan hasil yang diinginkan
bash
sebagai berikut:Perhatikan tanda kutip ganda di sekitar
$STR
. Ini berperilaku identik jika disimpan dan dijalankan sebagaibash
skrip.Berikut ini juga memberikan output yang diinginkan:
sumber
Mereka pemilih yang hanya membutuhkan baris baru dan membenci kode multiline yang merusak lekukan, bisa melakukan:
Bash (dan kemungkinan cangkang lain) melahap semua baris baru yang tertinggal setelah penggantian perintah, jadi Anda harus mengakhiri
printf
string dengan karakter yang bukan baris baru dan menghapusnya setelah itu. Ini juga bisa dengan mudah menjadi oneliner.sumber
Saya tidak terlalu senang dengan salah satu opsi di sini. Inilah yang bekerja untuk saya.
sumber
str=$(printf '%s\n' "first line" "another line" "and another line")
(shell akan dengan mudah (atau tidak) memotong baris baru akhir dari substitusi perintah). Beberapa jawaban di sini sudah dipromosikanprintf
dalam berbagai bentuk jadi saya tidak yakin ini menambah nilai sebagai jawaban terpisah.printf '%s\n' "first line" \
(baris baru, indentasi)'second line'
dll. Lihat jugaprintf -v str
untuk menetapkan ke variabel tanpa memunculkan subkulit.