<ก่อนหน้านี้ | Contents | ถัดไป>
คำคมคู่
ใบเสนอราคาประเภทแรกที่เราจะพิจารณาคือ คำพูดคู่. หากเราใส่ข้อความในเครื่องหมายคำพูดคู่ อักขระพิเศษทั้งหมดที่ใช้โดยเชลล์จะสูญเสียความหมายพิเศษและถือเป็นอักขระธรรมดา ข้อยกเว้นคือ “$”, “\" (แบ็กสแลช) และ “`” (เครื่องหมายแบ็กสแลช) ซึ่งหมายความว่าการแบ่งคำ การขยายชื่อพาธ การขยายเครื่องหมายทิลเดอร์ และการขยายวงเล็บปีกกา ถูกระงับ แต่การขยายพารามิเตอร์ การขยายเลขคณิต และการแทนที่คำสั่งยังคงดำเนินการอยู่ การใช้เครื่องหมายอัญประกาศคู่ เราสามารถจัดการกับชื่อไฟล์ที่มีช่องว่างฝังตัวได้ สมมติว่าเราเป็นเหยื่อโชคร้ายของไฟล์ชื่อ สองคำ.txt. หากเราพยายามใช้สิ่งนี้ในบรรทัดคำสั่ง การแยกคำจะทำให้สิ่งนี้ถือเป็นอาร์กิวเมนต์แยกกันสองอาร์กิวเมนต์ แทนที่จะเป็นอาร์กิวเมนต์เดี่ยวที่ต้องการ:
[me@linuxbox ~]$ ls -l สองคำ.txt
ls: ไม่สามารถเข้าถึงสอง: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว
ls: ไม่สามารถเข้าถึง word.txt: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว
[me@linuxbox ~]$ ls -l สองคำ.txt
ls: ไม่สามารถเข้าถึงสอง: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว
ls: ไม่สามารถเข้าถึง word.txt: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว
โดยใช้เครื่องหมายอัญประกาศคู่ เราจะหยุดการแยกคำและได้ผลลัพธ์ที่ต้องการ นอกจากนี้ เรายังสามารถซ่อมแซมความเสียหายได้:
[me@linuxbox ~]$ ls -l "สองคำ.txt"
-rw-rw-r-- 1 ฉัน ฉัน 18 2016-02-20 13:03 สองคำ.txt [me@linuxbox ~]$ mv "สองคำ.txt" two_words.txt
[me@linuxbox ~]$ ls -l "สองคำ.txt"
-rw-rw-r-- 1 ฉัน ฉัน 18 2016-02-20 13:03 สองคำ.txt [me@linuxbox ~]$ mv "สองคำ.txt" two_words.txt
ที่นั่น! ตอนนี้เราไม่ต้องพิมพ์เครื่องหมายคำพูดคู่ที่น่ารำคาญอีกต่อไป
โปรดจำไว้ว่า การขยายพารามิเตอร์ การขยายเลขคณิต และการแทนที่คำสั่งยังคงเกิดขึ้นภายในเครื่องหมายคำพูดคู่:
[me@linuxbox ~]$ echo "$USER $((2+2)) $(cal)"
ฉัน 4 กุมภาพันธ์ 2016
Su | Mo | Tu | We | Th | Fr | Sa |
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 |
เราควรใช้เวลาสักครู่เพื่อดูผลกระทบของเครื่องหมายคำพูดคู่ต่อการแทนที่คำสั่ง ขั้นแรก มาดูให้ลึกขึ้นอีกนิดว่าการแยกคำทำงานอย่างไร ในตัวอย่างก่อนหน้านี้ เราเห็นว่าการแยกคำปรากฏขึ้นเพื่อลบการเว้นวรรคส่วนเกินในข้อความของเราอย่างไร:
[me@linuxbox ~]$ ก้องนี่คือ
นี่คือการทดสอบ
ทดสอบ
[me@linuxbox ~]$ ก้องนี่คือ
นี่คือการทดสอบ
ตามค่าเริ่มต้น การแยกคำจะค้นหาการเว้นวรรค แท็บ และการขึ้นบรรทัดใหม่ (อักขระป้อนบรรทัด) และถือว่าเป็น ตัวคั่น ระหว่างคำ ซึ่งหมายความว่าช่องว่าง แท็บ และการขึ้นบรรทัดใหม่ที่ไม่ได้ใส่เครื่องหมายคำพูดจะไม่ถือว่าเป็นส่วนหนึ่งของข้อความ พวกเขาทำหน้าที่เป็นตัวคั่นเท่านั้น เนื่องจากแยกคำออกเป็นอาร์กิวเมนต์ที่แตกต่างกัน บรรทัดคำสั่งตัวอย่างของเราจึงมีคำสั่งตามด้วยอาร์กิวเมนต์ที่แตกต่างกันสี่ตัว ถ้าเราเพิ่มเครื่องหมายคำพูดคู่:
[me@linuxbox ~]$ echo "นี่คือ
ทดสอบ"
[me@linuxbox ~]$ echo "นี่คือ
นี่คือการทดสอบ
นี่คือการทดสอบ
การแยกคำถูกระงับ และช่องว่างที่ฝังตัวจะไม่ถือว่าเป็นตัวคั่น แต่จะกลายเป็นส่วนหนึ่งของการโต้แย้ง เมื่อเพิ่มเครื่องหมายคำพูดคู่ บรรทัดคำสั่งของเราจะมีคำสั่งตามด้วยอาร์กิวเมนต์เดียว
ข้อเท็จจริงที่ว่าการขึ้นบรรทัดใหม่ถือเป็นตัวคั่นโดยกลไกการแยกคำทำให้เกิดผลกระทบที่น่าสนใจ แม้ว่าจะเป็นเรื่องละเอียดอ่อนต่อการแทนที่คำสั่ง พิจารณาสิ่งต่อไปนี้:
[me@linuxbox ~]$ เสียงสะท้อน $(cal)
กุมภาพันธ์ 2016 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14
15 16 17 18 19 20 21 22 23 24 25 26 27
[me@linuxbox ~]$ เสียงสะท้อน "$(cal)"
กุมภาพันธ์ 2016
Su | Mo | Tu | We | Th | Fr | Sa |
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 |
ในตัวอย่างแรก การแทนที่คำสั่งที่ไม่ได้ใส่เครื่องหมายอัญประกาศทำให้เกิดบรรทัดรับคำสั่งที่มี 38 อาร์กิวเมนต์ ในบรรทัดที่สอง บรรทัดคำสั่งที่มีหนึ่งอาร์กิวเมนต์ที่มีช่องว่างฝังตัวและขึ้นบรรทัดใหม่