Di terminal Ubuntu 18.04 LTS, ketika saya menulis perintah ini:
echo -e "Hello\\\n"
Ini memberikan ini sebagai output:
Hello\n
Tetapi harus dicetak, seperti halaman manual mengatakan:
Hello\
Yaitu, pertama cetak Hello
, lalu \
, kemudian karakter baris baru (dan kemudian baris baru lainnya). Dimana masalahnya?
Lihat beberapa echo -e
perintah berikut dan hasilnya :
man420@man420-X542UQ:~$ echo -e "HEllo\a\a\a\a\a\a\\\n"
HEllo\n
man420@man420-X542UQ:~$ echo -e "HEllo\\\n"
HEllo\n
man420@man420-X542UQ:~$ echo -e "HEllo\a\\\n"
HEllo\n
command-line
echo
yolin00
sumber
sumber
echo
di tempat pertama: gunakanprintf
.Jawaban:
Backslash diperlakukan secara khusus oleh
echo -e
, tetapi pertama-tama mereka terkadang diperlakukan secara khusus oleh shell (yang dalam hal ini adalahbash
), sesuai dengan aturan mengutip shell .Argumen yang
echo
sebenarnya dilihat adalahHello\\n
. Karena Anda telah lulus-e
untukecho
, memperlakukan lolos backslash khusus, dan\\
ini jatuh ke satu\
. Finaln
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 .\
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\
.\
karakter pertama , ada\
karakter ketiga yang tidak terpengaruh oleh dua karakter pertama dan yang mendahului an
. Tetapin
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, jadiecho
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\
. Menjalankanecho -e "Hello\\n"
outputHello
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 digunakanprintf
daripadaecho
, yang dalam hal ini adalahprintf '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 adalahprintf 'Hello\\\n\n'
. Tetapi yangprintf
benar-benar bersinar adalah bahwa Anda dapat memasukkan argumen tambahan. Anda dapat menggunakanprintf '%s\n\n' 'Hello\'
, yang menyisipkan argumen kedua (secara harfiahHello\
karena tanda kutip tunggal tidak mengubah apa pun) sebagai pengganti%s
.sumber