SORU
6 EKİM 2010, ÇARŞAMBA


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
6 EKİM 2010, ÇARŞAMBA


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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • eyes4beautee

    eyes4beautee

    17 HAZİRAN 2011
  • PhoneBuff

    PhoneBuff

    10 HAZİRAN 2011
  • stokelycalm

    stokelycalm

    28 Aralık 2010