Bir değişkenin kabuk komut dosyasında boş olup olmadığını sınama


27

Bir değişkenin boş olup olmadığını test etmek için birçok farklı kabuk üzerinde defalarca kullanılan aşağıdaki tekniği gördüm:

if [ "x$1" = "x" ]; then 
    # Variable is empty
fi

Bunu kanonik olarak kullanmanın herhangi bir avantajı var if [ -z "$1" ]mı? Bir taşınabilirlik sorunu olabilir mi?

Yanıtlar:


17

Bazı tarihi kabuklar [ -n = "" ], ilk işlenenin =bir operatör gibi göründüğü yerlerin kafasını karıştırabilen ve bunu ayrıştırma [ -n = ]veya sözdizimi hatasına neden olabilecek çok basit bir çözümleyici uyguladı . Olarak [ "x$1" = x"" ], xönek teminat altın x"$1"muhtemelen operatör gibi bakmak ve tek yolu bu yüzden bu testi ayrıştırabilir kabuk muamele etmektir olamaz =ikili operatör olarak.

Tüm modern mermiler ve hatta hala daha eski mermiler hala çalışır durumda olsa bile, 4 kelimeye kadar tüm test ifadelerinin doğru şekilde ayrıştırılmasını zorunlu kılan POSIX kurallarına uyun . Yani [ -z "$1" ]eğer test uygun bir yoldur $1boş ve [ "$x" = "$y" ]iki değişkenin eşitliğini test etmek için uygun bir yoldur.

Bazı mevcut mermiler bile daha uzun ifadelerle karışabilir ve birkaç ifade aslında belirsizdir, bu nedenle daha uzun boole testleri oluşturmak için -ave -ooperatörlerini kullanmaktan kaçının ve bunun yerine [kabuğun kendi &&ve ||boole operatörlerine ayrı çağrılar kullanın .


3
Sadece tarihi kabukları değil . Bazı shticari Unicilere dayanan bazı ksh88'ler hala sorunlu. Detaylar için buraya bakınız.
Stéphane Chazelas

Bu ifade yanlıştır: boş [ -z "$1" ]olup olmadığını test etmek için uygun bir yoldur$1 . sh -c '[ -z "$1" ]' ''; sh -c '[ -z "$1" ]'- ikisi de 0 değerini döndürür, ancak ikinci durumda $1boş olamaz, çünkü mevcut değildir.
mikeserv


3

"Set -u" veya "set -o nounset" ile çalıştırırsanız yukarıdaki testler de hataya neden olur.

Boş bir değişkeni kontrol etmenin daha kararlı bir yolu parametre genişletme kullanmaktır :

MYVAR = $ {MYVAR: - "Kötü Değer"}

Bu yöntem, geleneksel bourne kabuğu, ksh ve bash için işe yarar.


2
Bunun, -> M = $ {M: - "Kötü Değer"} olarak yazıldığına inanıyorum
Gyan

0
    function isBlank {
 valueNoSpaces=$(echo "$@" | tr -d ' ')

 if [  "$valueNoSpaces" == null ] || [ -z "$valueNoSpaces" ] 
 then
       echo true ;
 else
       echo ""  ;
 fi
}

#Test
if [ $(isBlank "      ") ] 
then
    echo "isBlank \"      \" : it's blank"
else
    echo " isBlank \"      \": it is not blank"
fi

if [ $(isBlank "abc") ] 

then
    echo "isBlank \"abc\" : it's blank"
else
    echo "isBlank \"abc\" :it is not blank"
fi

if [ $(isBlank null) ] 
then
      echo "isBlank null : it's blank"
else
    echo "isBlank null : it is not blank"
fi

if [ $(isBlank "") ] 
then
    echo "isBlank \"\" : it's blank"
else
    echo "isBlank \"\" : it is not blank"
fi

#Result
isBlank "      " : it's blank

isBlank "abc" :it is not blank

isBlank null : it's blank

isBlank "" : it's blank

3
Merhaba! Ben emin bu sorar soru cevaplar nasıl olduğumu neden kullanmak =karşı -zşimdi nasıl.
dhag
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.