Kutipan tunggal dalam tanda kutip ganda dan manual referensi Bash

18

Di bagian 3.1.2.3 berjudul Kutipan Ganda, manual Bash mengatakan:

Menutup karakter dalam tanda kutip ganda ('"') mempertahankan nilai literal semua karakter dalam tanda kutip, dengan pengecualian '$', '`', '\', dan, ketika ekspansi sejarah diaktifkan, '!'.

Saat ini saya prihatin dengan kutipan tunggal ( ').

Ini makna khusus, yang dijelaskan dalam bagian sebelumnya, bagian 3.1.2.2 adalah:

Menutup karakter dalam tanda kutip tunggal ( ') mempertahankan nilai literal setiap karakter dalam tanda kutip. Kutipan tunggal mungkin tidak terjadi di antara tanda kutip tunggal, bahkan ketika didahului oleh garis miring terbalik.

Menggabungkan dua eksposisi,

 echo "'$a'"

di mana variabel atidak didefinisikan (karenanya $a= string nol), harus mencetak $apada layar, karena '', memiliki makna khusus di dalamnya, akan melindungi $dari interpretasi khusus. Sebaliknya, ia mencetak ''. Kenapa begitu?

Lavya
sumber

Jawaban:

21

The 'karakter kutip tunggal dalam Anda echomisalnya mendapat nilai yang literal (dan kehilangan maknanya) karena diapit tanda kutip ganda ( "). Karakter terlampir adalah tanda kutip ganda.

Yang dapat Anda lakukan adalah mencetak tanda kutip tunggal secara terpisah:

echo "'"'$a'"'"

atau melarikan diri $:

echo "'\$a'"
Anthon
sumber
Oh kamu benar sekali! Outputnya konsisten dengan jawaban Anda tetapi keraguan saya adalah pada baris "Menutup karakter dalam tanda kutip ganda ('"') mempertahankan nilai literal semua karakter dalam tanda kutip, dengan pengecualian '$', ' ’, ‘\’, and, when history expansion is enabled, ‘!’." in the manual. But now reading it again I realized the second character is not single quote, ("'") but tilde (""). Saya' Saya berterima kasih atas tanggapan cepat Anda. Terima kasih!
Lavya
2
Karakter kedua yang disebutkan dalam manual adalah backtick bukan tilde.
Kenny Evitt
6

Anda salah mengerti dokumentasi:

memiliki makna khusus di dalamnya, akan melindungi $ dari interpretasi khusus

"Memiliki nya arti khusus" berarti bahwa itu adalah ditafsirkan khusus tidak secara harfiah. Kutipan tunggal mencegah $agar tidak diperluas. Tapi tanda kutip tunggal dalam tanda kutip ganda adalah karakter literal yaitu mereka tidak mempengaruhi apa pun. Jika Anda ingin output $amaka Anda perlu echo '$a'.

Hauke ​​Laging
sumber
kamu benar. Saya tidak hanya salah memahami dokumen, tetapi juga salah membaca (mengaitkan "` "untuk" '"!). Anda benar tentang "tanda kutip tunggal dalam tanda kutip ganda adalah karakter literal". Terima kasih!
Lavya