Test sıfır bash uzunlukta dize: [ -n "$var" ] veya [ &;$ " var" ]
Bash betikleri sıfır uzunlukta dize için iki farklı şekilde test gördüm. Çoğu komut-n seçeneğini kullanın:
#!/bin/bash
# With the -n option
if [ -n "$var" ]; then
# Do something when var is non-zero length
fi
Ama-n seçeneği gerçekten gerekli değildir:
# Without the -n option
if [ "$var" ]; then
# Do something when var is non-zero length
fi
Hangisi daha iyi yol mu?
Sıfır-uzunluk için test etmek için iyi bir yol olduğu, aynı şekilde:
if [ -z "$var" ]; then
# Do something when var is zero-length
fi
ya
if [ ! "$var" ]; then
# Do something when var is zero-length
fi
CEVAP
Düzenleme:Bu arasında daha fazla farklılıklar gösteren daha kapsamlı bir versiyonu[
(test
aka)[[
.
Aşağıdaki tablo olup olmadığını gösteren bir değişkendir alıntı ya da değil, ister kullanın, tek ya da çift olup olmadığını parantez ve değişken içeren tek bir alan, bir şeyi etkileyip etkilemediğini kullanarak bir test ile veya olmadan -n/-z
uygun kontrol değişkeni.
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
Eğer bir değişken sıfır olmayan uzunlukta olup olmadığını bilmek istiyorsanız, aşağıdaki birini yapın:
- tek ayraç (sütun 2a) değişken alıntı
- kullanımı 15 ** ve tek parantez (sütun 4) değişken alıntı
- çift parantez ya da
-n
olmadan veya alıntı olmadan ve (sütunlar 1b - 4b) kullanın
Sütun 1a satır etiketli başlayarak bildirim "iki" sonucu [
değerlendirme olduğunu gösteririçindekilereğer koşullu ifadenin bir parçası gibi değişken (sonuç onaylama işlemi tarafından açık maçlar "" veya "F" açıklama sütununda). T [[
(sütun 1b) kullanıldığında, değişken içeriğini bir dizge olarak görülüyor ve değerlendiriliyor.
Sütun 3a ve 5a hataları değişken değeri bir alanı içerir gerçeğinden kaynaklanır ve değişken tırnak içine alınmamış. Sütunlarda gösterildiği gibi tekrar, 3b ve 5b, [[
bir dize değişkeni içeriğini değerlendirir.
Eğer [
, alamadım emin olmak için anahtar kullanıyorsanız, beklenmeyen sonuçlar değişken alıntı. [[
bunu kullanarak bir önemi yok.
Bastırılmış ediliyor hata iletileri,, "tekli operatör beklenen" ya da "ikili operatör beklenen".
Bu yukarıdaki tabloda üretilen yazısıdır.
#!/bin/bash
# by Dennis Williamson
# 2010-10-06, revised 2010-11-10
# for http://stackoverflow.com/questions/3869072/test-for-non-zero-length-string-in-bash-n-var-or-var
# designed to fit an 80 character terminal
dw=5 # description column width
w=6 # table column width
t () { printf "%-${w}s" "true"; }
f () { [[ $? == 1 ]] && printf "%-${w}s" "false " || printf "%-${w}s" "-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"'
while read -r d t
do
printf "%-${dw}s: " "$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
Nasıl dize Bash kabuğu ile dosyasında ...
Bash. Nasıl "iki dize sürümü"...
BASH: dize bir tamsayı olarak geçerli ...
Nasıl doğru ActionScript 3 SOAP web se...
Bir dize kontrol etmek için nasıl &quo...