มันหมายความว่าอะไรที่จะมี $“ ดอลลาร์ - นำหน้าสตริง” ในสคริปต์?


81

ฉันเพิ่งเห็นสิ่งนี้ในสคริปต์ init:

echo $"Stopping Apache"

เครื่องหมายดอลลาร์คืออะไร

การวิจัยของฉันจนถึงขณะนี้:

ฉันพบสิ่งนี้ในคู่มือทุบตี:

extquote

หากตั้งค่า$'string'และการ$"string"อ้างอิงจะดำเนินการภายในส่วน${parameter}ขยายที่อยู่ในเครื่องหมายคำพูดคู่ ตัวเลือกนี้เปิดใช้งานโดยค่าเริ่มต้น

... แต่ฉันไม่พบความแตกต่างระหว่างสตริงที่มีและไม่มีส่วน$นำหน้า:

$ 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

คำตอบ:


111

มีสองสิ่งที่ต่างกันเกิดขึ้นที่นี่ทั้งสองถูกบันทึกไว้ในbashคู่มือ

$'

เครื่องหมายคำพูดเดียวดอลลาร์เป็นรูปแบบพิเศษของการอ้างอิง:

การอ้างอิง ANSI C

คำของฟอร์ม 'string' ได้รับการปฏิบัติเป็นพิเศษ คำนี้ขยายออกเป็นสตริงด้วยอักขระเครื่องหมายทับขวาทับกลับแทนที่ตามที่ระบุโดยมาตรฐาน ANSI C

$"

เครื่องหมายดอลลาร์ - เครื่องหมายคำพูดคู่สำหรับการแปล:

การแปลสถานที่

สตริงที่ยกมาสองครั้งนำหน้าด้วยเครื่องหมายดอลลาร์ ('$') จะทำให้สตริงที่จะแปลตามสถานที่ปัจจุบัน หากโลแคลปัจจุบันคือ C หรือ POSIX เครื่องหมายดอลลาร์จะถูกละเว้น หากสตริงถูกแปลและแทนที่การแทนที่จะถูกใส่เครื่องหมายคำพูดคู่


22

เมื่อมีการขยายสตริงภายใน$''ลำดับ escape จะถูกตีความ จาก manpage:

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.

ตัวอย่างง่ายๆคือ \ n escape sequence สำหรับการขึ้นบรรทัดใหม่:

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

$ 

หมายเหตุ: คุณอาจได้รับผลลัพธ์ที่แตกต่างในเชลล์อื่นที่echoอาจตีความลำดับ escape โดยไม่ต้องระบุตัวเลือก


8
ไม่มีการกล่าวถึง$"..."ตามคำถาม
Peter.O

-4

คุณตีความคู่มือผิดไป คุณจะเห็นผลเมื่อสตริง $ -quote อยู่ในส่วน${parameter}ขยาย

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

แหล่งที่มาและการอ่านเพิ่มเติม: https://lists.gnu.org/archive/html/bug-bash/2005-10/msg00017.html


6
นี่ไม่ได้ตอบคำถาม: $"…"มันเป็นสิ่งที่แตกต่าง
Gilles

4
ขออภัยคำตอบของคุณไม่ถูกต้อง: ไม่จำเป็นต้องใช้ส่วน${}ขยายเพื่อใช้ประโยชน์จาก ANSI ตรวจสอบด้วยตัวคุณเอง:echo $'ab\ncd'
rozcietrzewiacz

1
ฉันคิดว่าคำตอบนี้พยายามอธิบายextquoteอย่างไม่ถูกต้องแทนที่จะถามคำถาม
jw013

1
"${...}"แตกต่างจาก$"..."
GypsyCosmonaut
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.