Apa perbedaan antara $ string yang dikutip dan string $ ganda dalam bash?

9

Saya mencoba untuk mengeksekusi baris baru menggunakan echodan mencoba mengikuti dua perintah:

  1. Perintah pertama:

    echo $'Hello World\nThis is a new line'

    Tanggapan:

    Hello World
    This is a new line
    
  2. Perintah kedua:

    echo $"Hello World\nThis is a new line"

    Tanggapan:

    Hello World\nThis is a new line

Pertanyaan saya adalah apa perbedaan antara string yang dibungkus dengan $' 'vs string yang dibungkus dengan $" "di bash's echo?

Rafaf Tahsin
sumber
Catatan bermanfaat: Kutipan ganda juga dikenal sebagai kutipan lemah dan Kutipan tunggal juga dikenal sebagai kutipan kuat.
Rafaf Tahsin
2
Ya, tapi "weak quote"dan 'strong quote'berbeda dari $'C String'dan $"I18N String".
DopeGhoti
Anda MVP yang asli. : D >>> @DopeGhoti
Rafaf Tahsin
Saya melakukan apa yang saya bisa (:
DopeGhoti

Jawaban:

10

Seperti yang dijelaskan di sini , sintaks $'string'menentukan string gaya-C yang mencakup karakter yang lolos sihir, seperti \nuntuk baris baru. $"string"adalah untuk ekspansi I18N, yang tidak memiliki keajaiban seperti itu.

Perhatikan bahwa ini berbeda dari yang lebih umum "string"(penawaran lemah) dan 'string'(penawaran kuat).

DopeGhoti
sumber
9

Di $awal string di:

echo $'Hello World\nThis is a new line'

menyebabkan urutan melarikan diri ditafsirkan.

Manual referensi Bash [mengatakan]

Kata-kata dalam bentuk $ 'string' diperlakukan secara khusus. Kata diperluas ke string, dengan karakter backslash-escaped diganti sebagaimana ditentukan oleh standar ANSI C. ...
..
Hasil yang diperluas dikutip satu, seolah tanda dolar belum ada.

Tapi

echo $"Hello World\nThis is a new line"

sama sekali berbeda. Ini [Artikel] pada terjemahan lokal yang spesifik mengatakan:

String yang dikutip ganda didahului oleh tanda dolar ('$') akan menyebabkan string diterjemahkan sesuai dengan lokal saat ini. Jika lokal saat ini adalah C atau POSIX, tanda dolar diabaikan. Jika string diterjemahkan dan diganti, penggantiannya dikutip ganda.


Catatan: IIRC keduanya $'string'dan $"string"mungkin tidak menemukan dukungan di antara shell yang berbeda. Tidak hanya orang-orang dari kerang lain melihat mereka dengan rasa ingin tahu, tetapi juga mereka berdebat tentang apakah ini bisa dihindari untuk skrip portabilitas.

sjsam
sumber
1
ksh93juga mengerti $'...'.
Kusalananda
@ Kusalananda: Hmm, Catatan bagus :)
sjsam
4
$'xxx'bukan bashism tetapi pertama kali diperkenalkan oleh kshbeberapa tahun sebelumnya bash. Saat ini juga didukung oleh zshdan busybox shsedang ditinjau oleh standar POSIX.
jlliagre
@ jlliagre: Menghargai waktu :). Saya berdiri dikoreksi ..
sjsam