ไพรเมอร์บูลีนด่วนสำหรับ Bash
ifคำสั่งคำสั่งจะใช้เวลาเป็นอาร์กิวเมนต์ (เช่นการทำ&&, ||ฯลฯ ) โค้ดผลลัพธ์จำนวนเต็มของคำสั่งถูกตีความเป็นบูลีน (0 / null = true, 1 / else = false)
testคำสั่งจะใช้เวลาดำเนินการและถูกดำเนินการเป็นข้อโต้แย้งifและส่งกลับรหัสผลในรูปแบบเดียวกับ นามแฝงของtestคำสั่งคือ[ซึ่งมักจะใช้กับifเพื่อทำการเปรียบเทียบที่ซับซ้อนมากขึ้น
trueและfalseงบทำอะไรและกลับรหัสผล (0 และ 1 ตามลำดับ) ดังนั้นพวกเขาสามารถใช้เป็นตัวอักษรแบบบูลใน Bash แต่ถ้าคุณใส่คำแถลงไว้ในที่ที่ตีความว่าเป็นสตริงคุณจะพบปัญหา ในกรณีของคุณ:
if [ foo ]; then ... # "if the string 'foo' is non-empty, return true"
if foo; then ... # "if the command foo succeeds, return true"
ดังนั้น:
if [ true ] ; then echo "This text will always appear." ; fi;
if [ false ] ; then echo "This text will always appear." ; fi;
if true ; then echo "This text will always appear." ; fi;
if false ; then echo "This text will never appear." ; fi;
นี้จะคล้ายกับการทำสิ่งที่ชอบกับecho '$foo'echo "$foo"
เมื่อใช้testคำสั่งผลลัพธ์จะขึ้นอยู่กับตัวดำเนินการที่ใช้
if [ "$foo" = "$bar" ] # true if the string values of $foo and $bar are equal
if [ "$foo" -eq "$bar" ] # true if the integer values of $foo and $bar are equal
if [ -f "$foo" ] # true if $foo is a file that exists (by path)
if [ "$foo" ] # true if $foo evaluates to a non-empty string
if foo # true if foo, as a command/subroutine,
# evaluates to true/success (returns 0 or null)
กล่าวโดยย่อหากคุณต้องการทดสอบสิ่งที่ผ่าน / ไม่ผ่าน (หรือที่เรียกว่า "จริง" / "เท็จ") ให้ส่งคำสั่งไปยังคำสั่งของคุณifหรือ&&อื่น ๆ โดยไม่ต้องใส่เครื่องหมายวงเล็บ สำหรับการเปรียบเทียบที่ซับซ้อนให้ใช้วงเล็บกับตัวดำเนินการที่เหมาะสม
และใช่ฉันรู้ว่าไม่มีสิ่งเช่น boolean ประเภทดั้งเดิมใน Bash และนั่นifและ[และtrueเป็น "คำสั่ง" ทางเทคนิคและไม่ใช่ "คำสั่ง" นี่เป็นเพียงคำอธิบายพื้นฐานที่ใช้งานได้ดีมาก