Backslash diperlakukan secara khusus oleh echo -e
, tetapi pertama-tama mereka terkadang diperlakukan secara khusus oleh shell (yang dalam hal ini adalah bash
), sesuai dengan aturan mengutip shell .
Argumen yang echo
sebenarnya dilihat adalah Hello\\n
. Karena Anda telah lulus -e
untuk echo
, memperlakukan lolos backslash khusus, dan \\
ini jatuh ke satu \
. Final n
tidak lolos, jadi itu muncul secara harfiah.
Alasan untuk ini adalah bahwa, sebelum dan secara terpisah dari operasi echo
itu sendiri, shell memperlakukan \
secara khusus dalam beberapa konteks tetapi tidak yang lain. Kuotasi \
karakter selalu diperlakukan khusus, dikutip tunggal \
tidak pernah diperlakukan khusus, tetapi pengobatan dikutip ganda \
karakter, seperti dalam perintah yang Anda berlari, lebih halus dan rumit.
Ketika shell menemukan teks kutipan ganda dalam sebuah perintah, seperti halnya "Hello\\\n"
, shell memperlakukan \
sebagai karakter pelarian ketika mendahului karakter yang dengan sendirinya dapat memiliki makna khusus di dalam tanda kutip ganda dan bukan sebaliknya .
- Karena
\
kadang-kadang memiliki makna khusus di dalam ""
, a \
yang segera mendahului yang lain \
memiliki efek mengutip yang kedua \
. Jadi di dalam tanda kutip ganda, yang pertama \\
diciutkan menjadi \
.
- Setelah dua
\
karakter pertama , ada \
karakter ketiga yang tidak terpengaruh oleh dua karakter pertama dan yang mendahului a n
. Tetapi n
bukan karakter yang pernah diperlakukan secara khusus di dalam tanda kutip ganda, jadi \
sebelum itu tidak diperlakukan secara khusus dalam situasi ini. Dengan demikian \n
tetap \n
.
Efeknya adalah bahwa, dalam tanda kutip ganda, \\\n
ditafsirkan sebagai \\n
.
Saat echo -e
dilihat \\n
, yang pertama \
menghapus makna khusus dari yang kedua, jadi echo
mencetak \n
secara harfiah untuk teks itu.
Jika tujuan Anda adalah mencetak Hello
dengan baris baru ekstra tetapi tidak ada garis miring terbalik (pertanyaannya semula tidak jelas tentang ini, ditambah saya pikir itu adalah contoh yang berguna), maka salah satu solusinya adalah menghapus a \
. Menjalankan echo -e "Hello\\n"
output Hello
dengan baris baru ekstra di akhir.
Solusi yang lebih baik adalah dengan menggunakan tanda kutip tunggal dan menulis echo -e 'Hello\n'
. Kutipan tunggal adalah bentuk kutipan terkuat. Solusi yang lebih baik biasanya digunakan printf
daripada echo
, yang dalam hal ini adalah printf 'Hello\n\n'
.
Jika tujuan Anda adalah mencetak Hello\
termasuk garis miring terbalik, diikuti oleh baris baru ekstra , maka pendekatan yang dikutip ganda mungkin dilakukan tetapi rumit. Untuk mengetahuinya, mundur pekerjaan: echo -e
mualaf \\
untuk \
dan \n
untuk baris baru, dan bertobat double-mengutip \\
untuk \
, sehingga Anda dapat melakukannya dengan enam backslashes ( echo -e "Hello\\\\\\n"
), karena \\n
ternyata dalam \n
karena satu backslash melarikan diri lagi. Anda juga dapat melakukannya dengan lima, karena kutip ganda tetap dipertahankan \n
ketika \
tidak lolos.
Ini menggambarkan manfaat dari kutipan tunggal: cukup masukkan apa pun yang Anda ingin echo -e
lihat di dalam kutipan tunggal ( echo -e 'Hello\\\n'
). printf
juga bagus di sini. Salah satu opsi adalah printf 'Hello\\\n\n'
. Tetapi yang printf
benar-benar bersinar adalah bahwa Anda dapat memasukkan argumen tambahan. Anda dapat menggunakan printf '%s\n\n' 'Hello\'
, yang menyisipkan argumen kedua (secara harfiah Hello\
karena tanda kutip tunggal tidak mengubah apa pun) sebagai pengganti %s
.