Chỉnh sửa: Đây là phiên bản hoàn chỉnh hơn cho thấy nhiều sự khác biệt giữa [
(aka test
) và [[
.
Bảng sau đây cho thấy rằng một biến được trích dẫn hay không, cho dù bạn sử dụng dấu ngoặc đơn hay dấu ngoặc kép và biến đó chỉ chứa một khoảng trắng là những điều ảnh hưởng đến việc sử dụng kiểm tra có hay không -n/-z
phù hợp để kiểm tra biến.
| 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
Nếu bạn muốn biết nếu một biến có độ dài khác không, hãy thực hiện bất kỳ thao tác nào sau đây:
- trích dẫn biến trong ngoặc đơn (cột 2a)
- sử dụng
-n
và trích dẫn biến trong ngoặc đơn (cột 4a)
- sử dụng dấu ngoặc kép có hoặc không có trích dẫn và có hoặc không có
-n
(cột 1b - 4b)
Lưu ý trong cột 1a bắt đầu từ hàng có nhãn "hai" rằng kết quả chỉ ra rằng [
đang đánh giá nội dung của biến như thể chúng là một phần của biểu thức điều kiện (kết quả khớp với xác nhận được ngụ ý bởi "T" hoặc "F" trong cột mô tả). Khi [[
được sử dụng (cột 1b), nội dung biến được xem dưới dạng chuỗi và không được đánh giá.
Các lỗi trong cột 3a và 5a là do thực tế là giá trị biến bao gồm một khoảng trắng và biến không được trích dẫn. Một lần nữa, như được hiển thị trong cột 3b và 5b, [[
đánh giá nội dung của biến là một chuỗi.
Tương ứng, đối với các thử nghiệm cho các chuỗi có độ dài bằng không, các cột 6a, 5b và 6b chỉ ra các cách chính xác để làm điều đó. Cũng lưu ý rằng bất kỳ thử nghiệm nào trong số này có thể bị phủ định nếu phủ định cho thấy mục đích rõ ràng hơn so với sử dụng thao tác ngược lại. Ví dụ : if ! [[ -n $var ]]
.
Nếu bạn đang sử dụng [
, chìa khóa để đảm bảo rằng bạn không nhận được kết quả không mong muốn là trích dẫn biến. Sử dụng [[
, nó không thành vấn đề.
Các thông báo lỗi, đang bị loại bỏ, là "toán tử đơn nguyên dự kiến" hoặc "toán tử nhị phân dự kiến".
Đây là kịch bản sản xuất bảng trên.
#!/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