เครื่องหมายคำพูดป้องกัน "คำแยก" นั่นคือ: การแบ่งตัวแปรออกเป็นหลายรายการที่ตัวอักขระช่องว่าง (หรือเพื่อให้แม่นยำมากขึ้นที่ช่องว่างแท็บและบรรทัดใหม่ตามที่กำหนดไว้ในค่าของ$IFS
ตัวแปรเชลล์เริ่มต้น)
ตัวอย่างเช่น,
$ var="one two"
$ howmany(){ echo $#; }
$ howmany $var
2
$ howmany "$var"
1
ที่นี่เรากำหนดhowmany
ฟังก์ชันที่เพิ่งแจ้งให้เราทราบว่ามีพารามิเตอร์ตำแหน่งเท่าใด อย่างที่คุณเห็นมีสองรายการที่ถูกส่งผ่านไปยังตัวแปรและด้วยอัญประกาศข้อความในตัวแปรจะถือเป็นหนึ่งหน่วย
นี่เป็นสิ่งสำคัญสำหรับการส่งผ่านข้อมูลที่ถูกต้อง ตัวอย่างเช่นหากตัวแปรมีพา ธ ไปยังไฟล์และชื่อไฟล์มีช่องว่างที่ใดก็ได้ในพา ธ คำสั่งที่คุณพยายามเรียกใช้อาจล้มเหลวหรือให้ผลลัพธ์ที่ไม่ถูกต้อง หากเราพยายามสร้างไฟล์ด้วย$var
ตัวแปรtouch $var
จะสร้างสองไฟล์ แต่touch "$var"
เพียงไฟล์เดียว
กันไปสำหรับ[ "$currentoutput" != "$lastoutput" ]
ส่วนของคุณ การทดสอบนี้ทำการเปรียบเทียบสองสาย เมื่อการทดสอบรัน[
คำสั่งจะต้องเห็นอาร์กิวเมนต์ 3 ตัวคือสตริงข้อความตัว!=
ดำเนินการและสตริงข้อความอื่น การรักษาอัญประกาศคู่เป็นการป้องกันการแยกคำและ[
คำสั่งจะเห็นอาร์กิวเมนต์ 3 ตัวนั้น ตอนนี้จะเกิดอะไรขึ้นถ้าตัวแปรไม่ได้ถูกอ้างอิง
$ var="hello world"
$ foo="hi world"
$ [ $var != $foo ]
bash: [: too many arguments
$
นี่แยกคำที่เกิดขึ้นและแทนที่จะ[
เห็นสองสายhello
และworld
ตามด้วยตามด้วยสองสายอื่น!=
ๆ hi world
จุดสำคัญคือว่าไม่มีเครื่องหมายคำพูดคู่เนื้อหาของตัวแปรจะถูกเข้าใจเป็นหน่วยแยกต่างหากมากกว่าหนึ่งรายการทั้งหมด
การกำหนดคำสั่งทดแทนไม่จำเป็นต้องมีเครื่องหมายคำพูดคู่เหมือนใน
var=$( df )
ที่คุณมีออกคำสั่งของการบันทึกไว้ในdf
var
อย่างไรก็ตามมันเป็นนิสัยที่ดีที่จะเพิ่มค่าเป็นสองเท่าของตัวแปรอัญประกาศและการทดแทนคำสั่ง$(...)
ยกเว้นว่าคุณต้องการให้เอาท์พุทเป็นรายการแยกต่างหาก
เมื่อสังเกตด้านข้าง
while [ true ]
ส่วนหนึ่งสามารถ
while true
[
เป็นคำสั่งที่ประเมินการขัดแย้งของมันและ[ whatever ]
เป็นจริงเสมอโดยไม่คำนึงถึงสิ่งที่อยู่ภายใน ในทางตรงกันข้ามให้while true
ใช้คำสั่งtrue
ที่ส่งคืนสถานะการออกจากความสำเร็จเสมอ (และนั่นคือสิ่งที่while
ลูปต้องการ) ความแตกต่างนั้นค่อนข้างชัดเจนมากขึ้นและทำการทดสอบน้อยลง หรือคุณสามารถใช้:
แทนtrue
echo "" date and Time
สามารถลบเครื่องหมายคำพูดคู่ในส่วนได้ พวกเขาเพียงแค่แทรกสตริงว่างและเพิ่มพื้นที่พิเศษเพื่อเอาท์พุท หากเป็นที่ต้องการอย่าลังเลที่จะเก็บมันไว้ที่นั่น แต่ไม่มีค่าการใช้งานเฉพาะในกรณีนี้
lsusb >> test.log
echo "$currentoutput" >> test.log
ส่วนนี้อาจจะถูกแทนที่ด้วย ไม่มีเหตุผลที่จะทำงานไม่ได้อีกครั้งหลังจากที่ได้รับการเรียกใช้อยู่แล้วในlsusb
currentoutput=$(lsusb)
ในกรณีที่บรรทัดใหม่ต่อท้าย
ต้องถูกเก็บรักษาไว้ในเอาต์พุต - เราสามารถเห็นค่าในการรันคำสั่งหลายครั้ง แต่ในกรณีที่lsusb
ไม่จำเป็นต้องทำเช่นนั้น คำสั่งภายนอกที่น้อยกว่าที่คุณเรียกใช้จะดีกว่าเพราะการโทรไปยังคำสั่งที่ไม่ใช่ในตัวทุกครั้งจะทำให้เกิดค่าใช้จ่ายใน CPU การใช้หน่วยความจำและเวลาดำเนินการ (แม้ว่าคำสั่งนั้น
ดูสิ่งนี้ด้วย:
while [ true ]
จะสร้างวงวนไม่สิ้นสุด แต่อาจไม่ใช่เพราะเหตุผลที่คุณคิดwhile [ false ]
ยังสร้างวงวนไม่สิ้นสุดเนื่องจากมีอาร์กิวเมนต์เดียว[ ... ]
ประสบความสำเร็จหากอาร์กิวเมนต์นั้นเป็นสตริงที่ไม่ว่างเปล่าwhile true
จะเรียกใช้คำสั่งชื่อจริงtrue
(ซึ่งจะประสบความสำเร็จเสมอ)