Saya tidak mengerti bagaimana bash mengevaluasi keluarnya karakter apostrof dalam string yang dikutip tunggal.
Berikut ini sebuah contoh:
$ echo ''\''Hello World'\'''
'Hello World' # works
$ echo '\'Hello World\''
> # expects you to continue input
Saya sudah mencoba mencari penjelasan untuk ini tetapi tidak bisa mendapatkan apa-apa. Apa yang dilakukan bash di sini?
echo \''Hello World'\'
Jawaban:
Dalam tanda kutip tunggal, tidak ada pelarian yang mungkin terjadi. Tidak ada cara bagaimana memasukkan penawaran tunggal ke dalam penawaran tunggal. Lihat Mengutip dalam bash man .
sumber
echo '\''
echo $'\'hello world\''
Selain kutipan tunggal dan ganda yang didukung POSIX,
bash
menyediakan jenis kutipan tambahan untuk memungkinkan kelas kecil karakter yang lolos (termasuk kutipan tunggal) dalam string yang dikutip:Lihat bagian KUTIPAN di
bash
halaman manual, di dekat bagian akhir. (Cari "ANSI C".)sumber
Untuk menjelaskan apa yang terjadi dengan tanda kutip Anda yang lolos, kami akan memeriksa contoh kedua Anda (juga lihat tanda kutip tunggal , atau tanda kutip kuat ):
Di sini, Anda membiarkan kutip tergantung, seperti yang telah Anda nyatakan. Sekarang rapikan ujungnya dan ubah menjadi:
Sub-string "Hello World" tidak dikutip di sini, tetapi berperilaku seolah-olah itu dikutip kuat. Dengan menggunakan contoh Anda lagi, rapikan ujungnya secara berbeda kali ini:
Sub-string "Hello World" lagi-lagi berperilaku seolah-olah dikutip kuat, dengan hanya tanda kutip ditambahkan (lolos, jadi tidak ada lagi kutipan tunggal) di akhir.
Ketika satu kutip tunggal ditambahkan pada bagian akhir (contoh asli Anda), string dibiarkan menggantung dan menunggu kutipan-dekat.
sumber
Contoh sederhana untuk menghindari kutip di shell:
Ini dilakukan dengan menutup yang sudah dibuka satu (
'
), menempatkan satu lolos (\'
) untuk mencetak, lalu membuka yang lain ('
).Kalau tidak:
Ini dilakukan dengan menyelesaikan yang sudah dibuka satu (
'
), menempatkan kutipan di kutipan lain ("'"
), lalu membuka yang lain ('
).Apa yang Anda lakukan (
'\'Hello World\''
), adalah:'
.\'
, sehingga string menjadi:'\'
.Hello World
bukan kutipan.\'
) tanpa membukanya.'
) adalah string pembuka, tetapi tidak ada penutup yang diharapkan.Jadi contoh yang benar adalah:
Terkait: Bagaimana cara melepaskan tanda kutip tunggal dalam string tanda kutip tunggal?
sumber