แก้ไข:นี้เป็นรุ่นที่สมบูรณ์มากขึ้นที่ความแตกต่างระหว่างการแสดงมากขึ้น[
(aka test
) [[
และ
ตารางต่อไปนี้แสดงให้เห็นว่าตัวแปรที่ยกมาหรือไม่ไม่ว่าคุณจะใช้วงเล็บเดียวหรือสองและว่าตัวแปรมีเพียงช่องว่างเป็นสิ่งที่มีผลต่อว่าการใช้การทดสอบมีหรือไม่มี-n/-z
เหมาะสำหรับการตรวจสอบตัวแปร
| 1a 2a 3a 4a 5a 6a | 1b 2b 3b 4b 5b 6b
| [ [" [-n [-n" [-z [-z" | [[ [[" [[-n [[-n" [[-z [[-z"
-----+------------------------------------+------------------------------------
unset| false false true false true true | false false false false true true
null | false false true false true true | false false false false true true
space| false true true true true false| true true true true false false
zero | true true true true false false| true true true true false false
digit| true true true true false false| true true true true false false
char | true true true true false false| true true true true false false
hyphn| true true true true false false| true true true true false false
two | -err- true -err- true -err- false| true true true true false false
part | -err- true -err- true -err- false| true true true true false false
Tstr | true true -err- true -err- false| true true true true false false
Fsym | false true -err- true -err- false| true true true true false false
T= | true true -err- true -err- false| true true true true false false
F= | false true -err- true -err- false| true true true true false false
T!= | true true -err- true -err- false| true true true true false false
F!= | false true -err- true -err- false| true true true true false false
Teq | true true -err- true -err- false| true true true true false false
Feq | false true -err- true -err- false| true true true true false false
Tne | true true -err- true -err- false| true true true true false false
Fne | false true -err- true -err- false| true true true true false false
หากคุณต้องการทราบว่าตัวแปรมีความยาวไม่เป็นศูนย์หรือไม่ให้ทำสิ่งใดสิ่งหนึ่งต่อไปนี้:
- พูดตัวแปรในวงเล็บเดียว (คอลัมน์ 2a)
- ใช้
-n
และอ้างอิงตัวแปรในวงเล็บเดียว (คอลัมน์ 4a)
- ใช้วงเล็บคู่ที่มีหรือไม่มีข้อความและมีหรือไม่มี
-n
(คอลัมน์ 1b - 4b)
โปรดสังเกตในคอลัมน์ 1a เริ่มต้นที่แถวที่มีป้ายกำกับ "สอง" ที่ผลลัพธ์บ่งชี้ว่า[
กำลังประเมินเนื้อหาของตัวแปรราวกับว่าพวกเขาเป็นส่วนหนึ่งของนิพจน์เงื่อนไข (ผลลัพธ์ตรงกับการยืนยันโดยนัยโดย "T" หรือ "F" ใน คอลัมน์คำอธิบาย) เมื่อ[[
ใช้ (คอลัมน์ 1b) เนื้อหาตัวแปรจะถูกมองว่าเป็นสตริงและไม่ได้รับการประเมิน
ข้อผิดพลาดในคอลัมน์ 3a และ 5a เกิดจากข้อเท็จจริงที่ว่าค่าตัวแปรรวมถึงช่องว่างและตัวแปรไม่ได้ถูกอ้างอิง อีกครั้งดังที่แสดงในคอลัมน์ 3b และ 5b [[
ประเมินเนื้อหาของตัวแปรเป็นสตริง
ตามลำดับสำหรับการทดสอบสตริงที่มีความยาวเป็นศูนย์คอลัมน์ 6a, 5b และ 6b แสดงวิธีที่ถูกต้องในการทำเช่นนั้น นอกจากนี้โปรดทราบว่าการทดสอบใด ๆ เหล่านี้สามารถถูกปฏิเสธได้หากปฏิเสธแสดงเจตนาที่ชัดเจนมากกว่าการใช้การปฏิบัติตรงข้าม ตัวอย่างเช่นif ! [[ -n $var ]]
.
หากคุณกำลังใช้[
กุญแจสำคัญในการตรวจสอบให้แน่ใจว่าคุณไม่ได้รับผลลัพธ์ที่ไม่คาดคิดคือการอ้างอิงตัวแปร ใช้[[
มันไม่สำคัญ
ข้อความแสดงข้อผิดพลาดซึ่งกำลังถูกระงับคือ "ตัวดำเนินการเอกนารีที่คาดไว้" หรือ "ตัวดำเนินการแบบไบนารีที่คาดหวัง"
นี่คือสคริปต์ที่สร้างตารางด้านบน
#!/bin/bash
# by Dennis Williamson
# 2010-10-06, revised 2010-11-10
# for http://stackoverflow.com/q/3869072
# designed to fit an 80 character terminal
dw=5 # description column width
w=6 # table column width
t () { printf '%-*s' "$w" " true"; }
f () { [[ $? == 1 ]] && printf '%-*s' "$w" " false" || printf '%-*s' "$w" " -err-"; }
o=/dev/null
echo ' | 1a 2a 3a 4a 5a 6a | 1b 2b 3b 4b 5b 6b'
echo ' | [ [" [-n [-n" [-z [-z" | [[ [[" [[-n [[-n" [[-z [[-z"'
echo '-----+------------------------------------+------------------------------------'
while read -r d t
do
printf '%-*s|' "$dw" "$d"
case $d in
unset) unset t ;;
space) t=' ' ;;
esac
[ $t ] 2>$o && t || f
[ "$t" ] && t || f
[ -n $t ] 2>$o && t || f
[ -n "$t" ] && t || f
[ -z $t ] 2>$o && t || f
[ -z "$t" ] && t || f
echo -n "|"
[[ $t ]] && t || f
[[ "$t" ]] && t || f
[[ -n $t ]] && t || f
[[ -n "$t" ]] && t || f
[[ -z $t ]] && t || f
[[ -z "$t" ]] && t || f
echo
done <<'EOF'
unset
null
space
zero 0
digit 1
char c
hyphn -z
two a b
part a -a
Tstr -n a
Fsym -h .
T= 1 = 1
F= 1 = 2
T!= 1 != 2
F!= 1 != 1
Teq 1 -eq 1
Feq 1 -eq 2
Tne 1 -ne 2
Fne 1 -ne 1
EOF