[
คำสั่งเป็นคำสั่งธรรมดา แม้ว่าเชลล์ส่วนใหญ่จะให้มันเป็นแบบในตัวเพื่อประสิทธิภาพ แต่มันก็เป็นไปตามกฎวากยสัมพันธ์ตามปกติของเชลล์ [
เทียบเท่ากับ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" ]]
(ยกเว้นกรณีที่คุณทำต้องการจับคู่รูปแบบ):
ในทั้งหมดนี้ถูกต้องเพื่อใช้เครื่องหมายคำพูดคู่ดังนั้นคุณอาจข้ามกฎขั้นสูงและใช้เครื่องหมายคำพูดตลอดเวลา