Bash'te bir değişkenin boş olup olmadığını bulma


262

Bash'te bir değişkenin boş olup olmadığını nasıl kontrol edebilirim?


2
Hangi tür kabuk betiği? * nix?
TJ Crowder

8
bash kabuk komut dosyası
Tree



Yanıtlar:


383

Bash'te $ var boşsa en azından aşağıdaki komut testleri yapılır :

if [[ -z "$var" ]]; then
   # Do what you want
fi

Komut man testarkadaşın.


62
çift ​​köşeli parantez burada işe yaramaz. basit [-z "$ var"] veya daha kolay olabilir imho eğer test -z "var" .. yine de +1 :)
Luca Borrione

2
çift ​​köşeli parantezler işe yaramaz, eğer inlcude değilse ./test.ksh[8]: test: argument expectedneden dunnot alıyorum ama tek parantez işe yaramadı ama çift bir tane vardı.
gahlot.jaggs

8
@LucaBorrione Bence demek istiyorsun if test -z "$var", değil mi?
neu242

1
Sadece soruda doğrudan belirtilmeyen belirli bir durum için eklenen bir yorum: değişken ayarlanmamışsa ve set -useçenek etkinleştirildiyse, bu test başarısız olur unbound variable. Bu durumda, @ alexli'nin çözümünü tercih edebilirsiniz.
anol

3
@LucaBorrione Tıpkı geç bir not olarak: "[[" "asla işe yaramaz" olarak görülebilir; "[[" kullanmanın "[" üzerinde bazı avantajları vardır (bkz. stackoverflow.com/questions/669452/… )
GhostCat

107

Bash varsayımı:

var=""

if [ -n "$var" ]; then
    echo "not empty"
else
    echo "empty"
fi

9
Daha doğrudan yanıt -z:[[ -z "$an_unset_or_empty_var" ]] && echo empty
glenn jackman

4
@ jackson: iyi yorum; -zsorulana daha yakın olduğu doğrudur . Jay bunu cevabına koydu, bu yüzden benimkini güncellemekten kaçınacağım ve olduğu gibi bırakacağım.
ChristopheD

48

Bende gördüm

if [ "x$variable" = "x" ]; then ...

ki bu çok sağlam ve kabuktan bağımsız.

Ayrıca, "boş" ve "ayarlanmamış" arasında bir fark vardır. Bkz. Bir dizenin Bash kabuk betiğinde tanımlanmadığını belirleme .


Bana garip geliyor. Lütfen bu çözümü açıklar mısınız? Teşekkür ederim.
guettli

2
@guettli: Boşsa $variable, karşılaştırma operatörünün solundaki dize yalnızca olur xve bu da operatörün sağındaki dizeye eşit olur. [ x = x ]"true" dır, bu yüzden pratikte bu testler $variableboş olup olmadığını test eder . Ek olarak (aslında 3½ yıl sonra :-)) Ben asla kendimi kullanmak istiyorum çünkü -zmuhtemelen daha net bir şekilde istediğim şeyi yapar, ama bu yöntemi sık sık "vahşi" görüldüğü için bu cevap eklemek istedim; belki de benden farklı deneyimleri olan insanlar tarafından bilerek yazılmıştır.
Daniel Andersson

30
if [ ${foo:+1} ]
then
    echo "yes"
fi

yesdeğişken ayarlanmışsa yazdırır . ${foo:+1}Değişken ayarlandığında 1, aksi takdirde boş dize döndürür.


2
Soruda bahsedilmese de, bu cevabın önemli bir avantajı, değişken tanımsız ve set -useçenek ( nounset) etkinleştirildiğinde bile çalışabilmesidir. Bu soruya hemen hemen tüm diğer cevaplar unbound variablebu durumda başarısız olacaktır .
anol

Bu :+gösterim, isteğe bağlı değişkenlerle belirttiğiniz isteğe bağlı komut satırı parametrelerine sahip olduğunuz durumlar için de yararlıdır. myprogram ${INFILE:+--in=$INFILE} ${OUTFILE:+--out=$OUTFILE}
Alan Porter


10
[ "$variable" ] || echo empty
: ${variable="value_to_set_if_unset"}

Varsayılan olarak bir var, artı 1
ehime

@ehime kullanacağınız varsayılan değeri yapmak için${variable:-default_value}
warvariuc

Bu, bir değişkenin girişinin geçerliliğini kontrol etmenin ve ayarlanmamışsa çıkmanın hızlı bir yoludur: [ "$variable" ] || exit
Marcel Sonderegger

8

trueBir değişken ayarlanmamışsa veya boş dizgiye ("") ayarlanmışsa bu geri döner .

if [ -z "$MyVar" ]
then
   echo "The variable MyVar has nothing in it."
elif ! [ -z "$MyVar" ]
then
   echo "The variable MyVar has something in it."
fi

3
Neden kullanmak elif !yerine else?
ZiggyTheHamster

1
Sadece iki ifade arasında bir ayrım yapmak, yani kullanmak ! [ -z "$MyVar" ], değişkenin içinde bir şey olacağı anlamına gelir . Ama ideal olarak kullanmak gerekir else.
3kstc

6

Soru sorar bir değişken boş bir dize olup olmadığını kontrol etmek nasıl ve en iyi cevapları Zaten bunun için verilmiştir.

Ama burada PHP'de programlama geçtikten sonra buraya indim ve aslında bir Bash kabuğunda çalışan PHP'deki boş fonksiyon gibi bir kontrol arıyordum .

Cevapları okuduktan sonra Bash'de düzgün düşünmediğimi fark ettim, ama o anda PHP'de boş bir işlev benim Bash kodumda çok kullanışlı olurdu.

Bu başkalarına olabilir düşünüyorum, ben Bash PHP boş fonksiyon dönüştürmeye karar verdi.

Göre PHP Kılavuzu :

bir değişken yoksa veya değeri aşağıdakilerden biri ise boş kabul edilir:

  • "" (boş bir dize)
  • 0 (tamsayı olarak 0)
  • 0.0 (şamandıra olarak 0)
  • "0" (dize olarak 0)
  • boş bir dizi
  • bildirilen ancak değeri olmayan bir değişken

Elbette null ve false olgular bash biçiminde dönüştürülemezler, bu yüzden atlanırlar.

function empty
{
    local var="$1"

    # Return true if:
    # 1.    var is a null string ("" as empty string)
    # 2.    a non set variable is passed
    # 3.    a declared variable or array but without a value is passed
    # 4.    an empty array is passed
    if test -z "$var"
    then
        [[ $( echo "1" ) ]]
        return

    # Return true if var is zero (0 as an integer or "0" as a string)
    elif [ "$var" == 0 2> /dev/null ]
    then
        [[ $( echo "1" ) ]]
        return

    # Return true if var is 0.0 (0 as a float)
    elif [ "$var" == 0.0 2> /dev/null ]
    then
        [[ $( echo "1" ) ]]
        return
    fi

    [[ $( echo "" ) ]]
}



Kullanım örneği:

if empty "${var}"
    then
        echo "empty"
    else
        echo "not empty"
fi



Demo:
Aşağıdaki snippet:

#!/bin/bash

vars=(
    ""
    0
    0.0
    "0"
    1
    "string"
    " "
)

for (( i=0; i<${#vars[@]}; i++ ))
do
    var="${vars[$i]}"

    if empty "${var}"
        then
            what="empty"
        else
            what="not empty"
    fi
    echo "VAR \"$var\" is $what"
done

exit

çıktılar:

VAR "" is empty
VAR "0" is empty
VAR "0.0" is empty
VAR "0" is empty
VAR "1" is not empty
VAR "string" is not empty
VAR " " is not empty

Bash mantığında bu fonksiyonda sıfırdaki kontrollerin yan sorunlara neden olabileceğini söyledikten sonra, bu fonksiyonu kullanan herkes bu riski değerlendirmeli ve belki de bu kontrolleri sadece birincisini bırakarak kesmeye karar vermelidir.


2

Ayarlanmamış değişkenler ile ayarlanmış ve boş değişkenler arasında ayrım yapmak isteyebilirsiniz:

is_empty() {
    local var_name="$1"
    local var_value="${!var_name}"
    if [[ -v "$var_name" ]]; then
       if [[ -n "$var_value" ]]; then
         echo "set and non-empty"
       else
         echo "set and empty"
       fi
    else
       echo "unset"
    fi
}

str="foo"
empty=""
is_empty str
is_empty empty
is_empty none

Sonuç:

set and non-empty
set and empty
unset

BTW, set -uayarlanmamış değişkenleri okurken hataya neden olacak şekilde kullanmanızı öneririm , bu sizi aşağıdaki gibi felaketlerden kurtarabilir

rm -rf $dir

Bunu ve "katı mod" için diğer en iyi uygulamaları burada okuyabilirsiniz .


Sıkı mod referansı için teşekkürler!
paulcm

1

V değişkeninin ayarlanmadığını kontrol etmek için

if [ "$v" == "" ]; then
   echo "v not set"
fi
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.