[คำสั่งเป็นคำสั่งธรรมดา แม้ว่าเชลล์ส่วนใหญ่จะให้มันเป็นแบบในตัวเพื่อประสิทธิภาพ แต่มันก็เป็นไปตามกฎวากยสัมพันธ์ตามปกติของเชลล์ [เทียบเท่ากับtestยกเว้นว่า[ต้องใช้]เป็นอาร์กิวเมนต์สุดท้ายและtestไม่
เครื่องหมายวงเล็บคู่[[ … ]]เป็นไวยากรณ์พิเศษ พวกเขาถูกนำมาใช้ใน ksh (หลายปีหลังจาก[) เพราะ[อาจมีปัญหาในการใช้อย่างถูกต้องและ[[ช่วยให้การเพิ่มที่ดีใหม่บางอย่างที่ใช้อักขระพิเศษของเชลล์ ตัวอย่างเช่นคุณสามารถเขียน
[[ $x = foo && $y = bar ]]
เนื่องจากนิพจน์เงื่อนไขทั้งหมดถูกวิเคราะห์คำโดยเชลล์ในขณะที่[ $x = foo && $y = bar ]ก่อนจะแบ่งออกเป็นสองคำสั่ง[ $x = fooและ$y = bar ]คั่นด้วยตัว&&ดำเนินการ วงเล็บคู่ที่คล้ายกันเปิดใช้งานสิ่งต่าง ๆ เช่นไวยากรณ์การจับคู่รูปแบบเช่น[[ $x == a* ]]เพื่อทดสอบว่าค่าxเริ่มต้นด้วยa; ในวงเล็บเดียวสิ่งนี้จะขยายa*ไปยังรายการไฟล์ที่ชื่อขึ้นต้นด้วยaในไดเรกทอรีปัจจุบัน วงเล็บคู่ถูกนำมาใช้ครั้งแรกใน ksh และมีให้เฉพาะใน ksh, bash และ zsh
ภายในวงเล็บเหลี่ยมคุณต้องใช้เครื่องหมายคำพูดคู่รอบ ๆ การแทนที่ตัวแปรเช่นในที่อื่น ๆ ส่วนใหญ่เพราะมันเป็นเพียงการขัดแย้งกับคำสั่ง (ซึ่งเกิดขึ้นเป็น[คำสั่ง) ภายในวงเล็บเหลี่ยมคุณไม่จำเป็นต้องมีเครื่องหมายคำพูดคู่เนื่องจากเชลล์ไม่ได้ทำการแบ่งคำหรือกลม: มันแยกวิเคราะห์การแสดงออกตามเงื่อนไขไม่ใช่คำสั่ง
มีข้อยกเว้นว่าเป็น[[ $var1 = "$var2" ]]ที่ที่คุณต้องการคำพูดหากคุณต้องการที่จะทำเปรียบเทียบสตริงไบต์เพื่อไบต์มิฉะนั้น$var2จะเป็นรูปแบบเพื่อให้ตรงกับ$var1กับ
สิ่งหนึ่งที่คุณไม่สามารถทำได้[[ … ]]คือใช้ตัวแปรเป็นตัวดำเนินการ ตัวอย่างเช่นนี่ถูกกฎหมายอย่างสมบูรณ์ (แต่ไม่ค่อยมีประโยชน์):
if [ -n "$reverse_sort" ]; then op=-gt; else op=-lt; fi
…
if [ "$x" "$op" "$y" ]; then …
ในตัวอย่างของคุณ
dir="/home/mazimi/VirtualBox VMs"
if [ -d ${dir} ]; then …
คำสั่งภายในifคือ[มี 4 ข้อโต้แย้ง-d, /home/mazimi/VirtualBox, และVMs ]เปลือกแยกวิเคราะห์แล้วไม่ทราบว่าจะทำอย่างไรกับ-d /home/mazimi/VirtualBox VMsคุณจะต้องป้องกันการแยกคำ${dir}เพื่อให้ได้คำสั่งที่มีรูปแบบที่ถูกต้อง
โดยทั่วไปแล้วให้ใช้เครื่องหมายอัญประกาศคู่ล้อมรอบตัวแปรและคำสั่งแทนเว้นแต่คุณจะรู้ว่าคุณต้องการแยกคำและกลมกลืนกับผลลัพธ์ สถานที่หลักที่ปลอดภัยที่จะไม่ใช้เครื่องหมายคำพูดคู่คือ:
- ในการมอบหมาย:
foo=$bar(แต่โปรดทราบว่าคุณจำเป็นต้องมีเครื่องหมายอัญประกาศคู่ในexport "foo=$bar"หรือในการกำหนดอาร์เรย์เช่นarray=("$a" "$b"))
- ใน
caseคำสั่ง: case $foo in …;
- ในวงเล็บคู่ยกเว้นทางด้านขวามือของคน
=หรือ==ผู้ประกอบการ [[ $x = "$y" ]](ยกเว้นกรณีที่คุณทำต้องการจับคู่รูปแบบ):
ในทั้งหมดนี้ถูกต้องเพื่อใช้เครื่องหมายคำพูดคู่ดังนั้นคุณอาจข้ามกฎขั้นสูงและใช้เครื่องหมายคำพูดตลอดเวลา