Apa artinya memiliki $ “string awalan dolarign” dalam sebuah skrip?

81

Saya baru saja melihat ini dalam skrip init:

echo $"Stopping Apache"

Untuk apa tanda dolar itu?

Penelitian saya sejauh ini:

Saya menemukan ini di manual bash:

extquote

Jika diatur, $'string'dan $"string"mengutip dilakukan dalam ${parameter}ekspansi yang dilampirkan dalam tanda kutip ganda. Opsi ini diaktifkan secara default.

... tapi saya tidak menemukan perbedaan antara string dengan dan tanpa $awalan:

$ echo "I am in $PWD"
I am in /var/shared/home/southworth/qed
$ echo $"I am in $PWD"
I am in /var/shared/home/southworth/qed
$ echo $"I am in ${PWD}"
I am in /var/shared/home/southworth/qed
$ echo "I am in ${PWD}"
I am in /var/shared/home/southworth/qed
$ echo 'I am in ${PWD}'
I am in ${PWD}
$ echo $'I am in ${PWD}'
I am in ${PWD}
$ echo $'I am in $PWD'
I am in $PWD
Ed Brannin
sumber

Jawaban:

111

Ada dua hal berbeda yang terjadi di sini, keduanya didokumentasikan dalam bashmanual

$ '

Kutipan tunggal tanda dolar adalah bentuk kutipan khusus:

ANSI C Kutipan

Kata-kata dalam bentuk $ 'string' diperlakukan secara khusus. Kata diperluas ke string, dengan karakter backslash-escape diganti seperti yang ditentukan oleh standar ANSI C.

$ "

Kutipan ganda dolar-tanda adalah untuk lokalisasi:

Terjemahan lokal

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.

jw013
sumber
22

Ketika string diperluas di dalam $'', urutan escape ditafsirkan. Dari halaman manual:

Words of the form $'string' are treated specially. The word expands to
string, with backslash-escaped characters replaced as specified by  the
ANSI  C  standard.

Contoh yang mudah adalah urutan pelarian \ n untuk baris baru:

$ echo 'foo\n'
foo\n
$ echo $'foo\n'
foo

$ 

Catatan: Anda mungkin mendapatkan hasil berbeda di shell lain karena echodapat menafsirkan urutan melarikan diri tanpa memberikan opsi.

jordanm
sumber
8
Tidak disebutkan $"...", sesuai pertanyaan.
Peter.O
-4

Anda salah menafsirkan manual. Anda hanya akan melihat efek ketika string $-dikutip di dalam ${parameter}ekspansi.

$ echo "${v:-'ab\ncd'}"
'ab\ncd'
$ echo "${v:-$'ab\ncd'}"
ab
cd

Sumber dan bacaan lebih lanjut: https://lists.gnu.org/archive/html/bug-bash/2005-10/msg00017.html

Benjamin Barenblat
sumber
6
Ini tidak menjawab pertanyaan: $"…"ada sesuatu yang berbeda.
Gilles
4
Maaf, tetapi jawaban Anda salah: tidak perlu menggunakan ${}ekspansi untuk menggunakan kutipan ANSI. Periksa sendiri:echo $'ab\ncd'
rozcietrzewiacz
1
Saya pikir jawaban ini mencoba menjelaskan dengan extquotetidak tepat apa yang ditanyakan oleh pertanyaan itu.
jw013
1
"${...}"berbeda dari$"..."
GypsyCosmonaut