Düzenleme: Bu [
(aka test
) ve arasında daha fazla fark gösteren daha eksiksiz bir sürümüdür [[
.
Aşağıdaki tabloda, bir değişkenin alıntılanıp alıntılanmayacağı, tek veya çift parantez kullanıp kullanmadığınız ve değişkenin yalnızca boşluk içerip içermediği, bir değişkenin test edilip edilmediğinin -n/-z
bir değişkenin kontrol edilmesi için uygun olup olmadığını etkileyen şeyler olduğunu göstermektedir.
| 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
Bir değişkenin sıfır olmayan bir uzunluk olup olmadığını bilmek istiyorsanız, aşağıdakilerden birini yapın:
- değişkeni tek parantez içinde alıntılayın (sütun 2a)
-n
değişkeni tek parantez içinde kullanın ve alıntılayın (sütun 4a)
- tırnaklı veya tırnaksız veya tırnaksız çift parantez kullanın
-n
(sütun 1b - 4b)
Sütun la'da "iki" etiketli satırdan başlayarak sonucun değişkenin içeriğini koşullu ifadenin bir parçasıymış gibi [
değerlendirdiğini belirten uyarı (sonuç, "T" veya "F" açıklama sütunu). Tüm (sütun 1 b) kullanıldığında, değişken içermektedir bir dizi olarak görülmektedir ve değerlendirilmez.[[
Sütunlar 3a ve 5a'daki hatalar, değişken değerinin bir boşluk içerdiği ve değişkenin tırnaksız olmasından kaynaklanır. Yine, 3b ve 5b sütunlarında gösterildiği gibi [[
, değişkenin içeriğini bir dize olarak değerlendirir.
Buna uygun olarak, sıfır uzunluklu dizeler için testlerde, sütun 6a, 5b ve 6b bunu yapmanın doğru yollarını gösterir. Ayrıca, olumsuzlama, ters işlemi kullanmaktan daha açık bir niyet gösteriyorsa, bu testlerden herhangi birinin reddedilebileceğini unutmayın. Örneğin: if ! [[ -n $var ]]
.
Kullanıyorsanız [
, beklenmedik sonuçlar almadığınızdan emin olmanın anahtarı değişkeni tırnak içine almaktır. Kullanmak [[
önemli değil.
Gizlenmekte olan hata iletileri "tekli operatör bekleniyor" veya "ikili operatör bekleniyor" şeklindedir.
Bu, yukarıdaki tabloyu oluşturan komut dosyasıdır.
#!/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