ความแตกต่างระหว่างคำพูดเดี่ยวและคู่ใน Bash Shell คืออะไร?
การใส่ข้อความในเครื่องหมายอัญประกาศเป็นการปฏิบัติที่ค่อนข้างเป็นมาตรฐานบนบรรทัดคำสั่งโดยเฉพาะเมื่อจัดการกับไฟล์ที่มีช่องว่างในชื่อ แต่คุณจะทราบได้อย่างไรว่าจะใช้เครื่องหมายคำพูดเดี่ยวหรือคู่ ลองดูที่ความแตกต่างและเมื่อคุณควรใช้อันหนึ่งเทียบกับอีกอัน.
กฎทั่วไปคือเครื่องหมายคำพูดคู่ยังคงอนุญาตให้ขยายตัวแปรภายในเครื่องหมายคำพูดและเครื่องหมายคำพูดเดี่ยวไม่ได้ อ่านต่อไป.
คำพูดด้วยข้อความที่เรียบง่าย
หากคุณเพียงแค่ใส่คำสองสามคำไว้มันไม่สำคัญว่าคุณจะใช้คำใดเพราะทั้งคู่จะทำงานเหมือนกันทุกประการ ตัวอย่างเช่นคำสั่งทั้งสองนี้จะสร้างไดเรกทอรีชื่อ Test Directory:
mkdir "ไดเรกทอรีทดสอบ"
mkdir 'ไดเรกทอรีทดสอบ'
ประเภทที่มีประสบการณ์มากกว่าอาจจะทราบว่าคุณสามารถใช้ mkdir Test \ Directory ได้ถ้าต้องการ.
การขยายตัวของตัวแปรเชลล์
ความแตกต่างระหว่างเครื่องหมายคำพูดเดี่ยวและคู่จะมีความสำคัญมากขึ้นเมื่อคุณจัดการกับตัวแปรในบรรทัดคำสั่งโดยค่าเริ่มต้น bash จะขยายตัวแปรเช่น $ test ไปยังสตริงแบบเต็ม ก่อนอื่นเราจะกำหนดตัวแปร:
ทดสอบ = "นี่คือการทดสอบ"
ตอนนี้คุณสามารถใช้ตัวแปรนี้ในบรรทัดคำสั่งเช่นนี้ซึ่งควรส่งออก นี่คือการทดสอบ ไปที่คอนโซล:
echo $ test
นี่คือจุดที่ความแตกต่างระหว่างเครื่องหมายคำพูดคู่และคำเดี่ยวจะชัดเจนยิ่งขึ้นเมื่อคุณใช้เครื่องหมายคำพูดเดี่ยวตัวแปรจะไม่ถูกขยาย ตัวอย่างเช่นหากคุณใช้คำสั่งนี้:
echo '$ test'
คุณจะไม่เห็นอะไรนอกจาก '$ test' บนบรรทัดคำสั่งเมื่อคุณใช้เครื่องหมายคำพูดเดี่ยว แต่จะแสดงผลลัพธ์อย่างถูกต้องเมื่อคุณใช้เครื่องหมายคำพูดคู่:
สิ่งเดียวกันทำงานเมื่อคุณใช้อักขระ 'เพื่อขยายคำสั่งบนบรรทัดคำสั่ง ตัวอย่างเช่นสมมติว่าคุณต้องการใช้ รหัสผ่าน คำสั่งจากภายในคำสั่งอื่น - คุณจะต้องใช้ backticks เพื่อบอกเชลล์เพื่อขยาย:
echo 'pwd' / ทดสอบ
หากคุณอยู่ในโฟลเดอร์บ้านของคุณคุณจะเห็นผลลัพธ์ที่มีลักษณะดังนี้:
/ home / geek / ทดสอบ
ตัวอย่างเช่นคุณอยู่ในโฟลเดอร์ที่มีช่องว่างในพา ธ และคุณต้องการใช้คำสั่ง ln เพื่อสร้างลิงก์สัญลักษณ์ไปยังไฟล์ในไดเรกทอรีปัจจุบัน โดยปกติคุณจะต้องระบุเส้นทางแบบเต็มเมื่อใช้คำสั่ง ln ดังนั้นจึงง่ายต่อการใช้ 'pwd' เพื่อบันทึกการพิมพ์.
ดูว่าเกิดอะไรขึ้นเมื่อคุณลองและใช้คำสั่งโดยไม่ต้องใส่เครื่องหมายคำพูด:
ln -s 'pwd' / test / home / geek / linkedname
คุณจะต้องล้อมรอบด้วยเครื่องหมายคำพูดแทน:
ln -s "'pwd' / filename" / some / other / path
สำหรับตัวอย่างที่เป็นรูปธรรมมากขึ้นสมมติว่าเรามีโครงสร้างโฟลเดอร์เช่นนี้โดยที่ชื่อไฟล์ทั้งหมดมีช่องว่างอยู่:
เนื่องจากคำสั่ง unzip ไม่สนับสนุนการใช้ * เพื่อเรียกใช้กับไฟล์ทั้งหมดคุณจะต้องใช้คำสั่ง for แทน นี่คือสิ่งที่น่าสนใจ:
สำหรับ f ใน * .zip ทำ unzip $ f เสร็จแล้ว
อ๊ะ! ดูเหมือนว่ามันจะไม่ทำงาน.
สิ่งที่เราต้องทำคือใช้เครื่องหมายคำพูดคู่รอบ ๆ ตัวแปร $ f เช่นนี้
สำหรับ f ใน * .zip; ทำ unzip "$ f";
ตอนนี้ทุกครั้งที่คำสั่ง for ผ่านลูปก็จะต้องรันคำสั่งแบบนี้:
เปิดเครื่องรูด "ทดสอบ 1.zip"
แน่นอนว่ามันจะวนซ้ำและเรียกใช้คำสั่งที่คล้ายกันสำหรับทุกไฟล์ในไดเรกทอรี.
มารีวิวกัน
ตอนนี้เราได้ผ่านตัวอย่างเราจะตรวจสอบอย่างรวดเร็วในกรณีที่คุณพลาด:
คำคมคู่
- ใช้เมื่อคุณต้องการใส่ตัวแปรหรือใช้การขยายเชลล์ภายในสตริง.
- อักขระทั้งหมดภายในถูกตีความว่าเป็นอักขระปกติยกเว้นสำหรับ $ หรือ 'ซึ่งจะถูกขยายบนเชลล์.
คำคมเดียว
- อักขระทั้งหมดภายในเครื่องหมายคำพูดเดียวถูกตีความว่าเป็นอักขระสตริง.
และจบบทเรียนของคำพูด ใช้พวกเขาอย่างชาญฉลาด.