อะไรคือความแตกต่างระหว่าง $ 'string' ที่ยกมาเดี่ยวกับ $“ string” ที่เสนอในการทุบตี?


9

ฉันพยายามรันบรรทัดใหม่โดยใช้echoและลองทำตามสองคำสั่ง:

  1. คำสั่งแรก:

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

    การตอบสนอง:

    Hello World
    This is a new line
    
  2. คำสั่งที่สอง:

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

    การตอบสนอง:

    Hello World\nThis is a new line

คำถามของฉันคือสิ่งที่แตกต่างระหว่างสตริงห่อด้วย$' 'VS สตริงห่อด้วย$" "ในbash's echo?


หมายเหตุที่เป็นประโยชน์: การอ้างอิงแบบคู่นั้นเรียกว่าการอ้างแบบอ่อน
Rafaf Tahsin

2
แต่ก็ใช่"weak quote"และ'strong quote'จะแตกต่างจากและ$'C String' $"I18N String"
DopeGhoti

คุณคือ MVP ที่แท้จริง : D >>> @DopeGhoti
Rafaf Tahsin

ฉันทำสิ่งที่ฉันสามารถทำได้ (:
DopeGhoti

คำตอบ:


10

ตามที่อธิบายไว้ที่นี่ไวยากรณ์$'string'ระบุสตริง C-style ซึ่งรวมถึงอักขระที่หลบหนีเวทย์เช่น\nสำหรับการขึ้นบรรทัดใหม่ $"string"สำหรับการขยาย I18N ซึ่งไม่มีทางหนีเวทย์ดังกล่าว

โปรดทราบว่าสิ่งเหล่านี้แตกต่างจากการใช้ร่วมกันมากขึ้น"string"(การอ้างอิงที่ไม่ชัดเจน) และ'string'(การอ้างอิงที่แข็งแกร่ง)


9

The $ในตอนต้นของสตริงใน:

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

ทำให้ escape sequences ถูกตีความ

คู่มืออ้างอิง Bash [พูดว่า]

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

แต่

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

แตกต่างอย่างสิ้นเชิง นี้[บทความ]การแปลงสถานที่เฉพาะเจาะจงพูดว่า:

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


หมายเหตุ: IIRC ทั้งสอง$'string'และ$"string"อาจไม่พบการสนับสนุนในเชลล์ที่แตกต่างกัน ไม่เพียง แต่ผู้คนจากหอยอื่น ๆ จะมองพวกเขาด้วยความอยากรู้อยากเห็น แต่พวกเขาก็ยังถกเถียงกันว่าจะหลีกเลี่ยงความสามารถในการพกพาสคริปต์ได้หรือไม่


1
ksh93$'...'ยังเข้าใจ
Kusalananda

@Kusalananda: อืมมมโปรดทราบ :)
sjsam

4
$'xxx'ไม่ bashism แต่เป็นครั้งแรกที่นำมาใช้โดยkshหลายปีก่อนbashได้ ขณะนี้ยังได้รับการสนับสนุนzshและbusybox shและอยู่ระหว่างการตรวจสอบโดยมาตรฐาน POSIX
jlliagre

@jlliagre: ขอบคุณเวลา :) ฉันยืนแก้ไข ..
sjsam
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.