คุณจะใช้เครื่องหมายอัญประกาศเดี่ยวในสตริงที่มีเครื่องหมายคำพูดเดี่ยวได้อย่างไร?


18

ฉันไม่เข้าใจว่า bash จะประเมินการหลบหลีกของอักขระ apostrophe ได้อย่างไรในสตริงที่ยกมาเดี่ยว

นี่คือตัวอย่าง:

$ echo ''\''Hello World'\'''
'Hello World' # works

$ echo '\'Hello World\''
 > # expects you to continue input

ฉันพยายามค้นหาคำอธิบาย แต่ไม่สามารถรับอะไรได้ ทุบตีทำอะไรที่นี่?


echo \''Hello World'\'
คณิตศาสตร์

คำตอบ:


19

ในเครื่องหมายคำพูดเดียวไม่สามารถหลีกหนีได้ ไม่มีวิธีรวมคำพูดเดียวในคำพูดเดียว ดูQuotingในคนทุบตี


1
คุณถูก. เคล็ดลับอยู่ในบรรทัด 'คำพูดเดียวอาจไม่เกิดขึ้นระหว่างคำพูดเดี่ยวแม้ว่าจะนำหน้าด้วยเครื่องหมายทับขวา' ดังนั้นมันอาจแยกมันออกเป็นส่วนต่าง ๆ
Kibet

@Colin ทันทีที่ใบเสนอราคาเดียวอยู่ในเครื่องหมายอัญประกาศเดี่ยวอีกสองตัว (แต่แบ็กสแลช) การเสนอราคาที่ยกมานั้นไม่ใช่การเสนอราคาจริงอีกต่อไป มันเป็นเพียงถ่านที่ไม่มีลักษณะการจับคู่พิเศษ
zero2cx

1
@ zero2cx: ไม่เป็นความจริง:echo '\''
choroba

@ zero2cx: ฉันจะพูดว่า "นอก" แทนที่จะเป็น "ข้างใน"
choroba

3
@choroba ไม่ได้ "เต็มเปา" จริงในทุบตีคุณสามารถทำได้echo $'\'hello world\''
bufh

9

นอกเหนือจาก POSIX ที่สนับสนุน Single- และ Double-Quoting แล้วbashยังมีประเภทของข้อความเพิ่มเติมเพื่อให้ตัวละครที่มีคลาสเล็ก ๆ สามารถหลบหนีออกมา (รวมถึงคำพูดเดียว) ในสตริงที่ยกมา:

$ echo $'\'Hello World\''
'Hello World'

ดูส่วนการอ้างอิงในbashหน้าคนใกล้ส่วนท้ายของส่วน (ค้นหา "ANSI C")


3

เพื่ออธิบายสิ่งที่เกิดขึ้นกับอะพอสโทรฟีที่หนีออกมาของคุณเราจะตรวจสอบตัวอย่างที่สองของคุณ (ดูคำพูดเดียวหรือคำพูดที่แข็งแกร่ง ):

$ echo '\'Hello World\''
>     # expects you to continue input

ที่นี่คุณออกจากการเสนอราคาตามที่คุณระบุไว้ ตอนนี้ตัดส่วนท้ายและเปลี่ยนเป็น:

                     v                                v           v
$ echo '\'Hello World     # Echo two strings: '\' and 'Hello World'.
\Hello World         ^

สตริงย่อย "Hello World" ไม่ได้ยกมาที่นี่ แต่มันทำตัวเหมือนมันเป็นคำพูดที่รัดกุม ใช้ตัวอย่างของคุณอีกครั้งตัดปลายให้แตกต่างกันในเวลานี้

                     vv                                    v (plain apostrophe)
$ echo '\'Hello World\'   # Will echo: '\' and 'Hello World''
\Hello World'        ^^   # Note that the trailing ' char is backslash escaped. 

สตริงย่อย "Hello World" จะทำงานอีกครั้งราวกับว่ามีการอ้างถึงอย่างแน่นหนาโดยมีเครื่องหมายอัญประกาศเดี่ยวเพิ่ม (หนีออกไปดังนั้นจึงไม่มีการเสนอราคาเดียวอีกต่อไป) ในตอนท้าย

เมื่อมีการเพิ่มเครื่องหมายคำพูดเดี่ยวอื่นลงในส่วนท้าย (ตัวอย่างดั้งเดิมของคุณ) สตริงจะถูกหยุดไว้และรอการอ้างถึงอย่างใกล้ชิด


3

ตัวอย่างง่ายๆของการหลีกเลี่ยงคำพูดในเชลล์:

$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc

ทำได้โดยการปิดแล้วเปิดหนึ่ง ( ') วางหนีหนึ่ง ( \') เพื่อพิมพ์แล้วเปิดอีกหนึ่ง ()' )

อีกวิธีหนึ่งคือ:

$ echo 'abc'"'"'abc'
abc'abc
$ echo "abc"'"'"abc"
abc"abc

มันเสร็จสิ้นโดยเปิดแล้วหนึ่ง ( ') วางใบเสนอราคาในใบเสนอราคาอื่น ( "'") แล้วเปิดอีกหนึ่ง ( ')

สิ่งที่คุณทำ ( '\'Hello World\'') คือ:

  1. เปิดเครื่องหมายวรรคตอนที่ '1:
  2. ปิดทันทีหลังจากนั้น\'ดังนั้นสตริงจะกลายเป็น: '\'.
  3. Hello World ไม่ใช่คำพูด
  4. วางเครื่องหมายอะโพสโทรฟี ( \') โดยไม่ต้องเปิด
  5. เครื่องหมายวรรคตอนสุดท้าย ( ') คือการเปิดสตริง แต่ไม่มีการปิดที่คาดไว้

ดังนั้นตัวอย่างที่ถูกต้องจะเป็น:

$ echo \'Hello World\'
'Hello World'

ที่เกี่ยวข้อง: วิธีการหลีกเลี่ยงคำพูดเดี่ยวภายในสตริงที่ยกมาเดี่ยว?

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