Bash'te bir değişkenin boş olup olmadığını nasıl kontrol edebilirim?
Bash'te bir değişkenin boş olup olmadığını nasıl kontrol edebilirim?
Yanıtlar:
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 test
arkadaşın.
./test.ksh[8]: test: argument expected
neden dunnot alıyorum ama tek parantez işe yaramadı ama çift bir tane vardı.
if test -z "$var"
, değil mi?
set -u
seçenek etkinleştirildiyse, bu test başarısız olur unbound variable
. Bu durumda, @ alexli'nin çözümünü tercih edebilirsiniz.
Bash varsayımı:
var=""
if [ -n "$var" ]; then
echo "not empty"
else
echo "empty"
fi
-z
:[[ -z "$an_unset_or_empty_var" ]] && echo empty
-z
sorulana 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.
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 .
$variable
, karşılaştırma operatörünün solundaki dize yalnızca olur x
ve bu da operatörün sağındaki dizeye eşit olur. [ x = x ]
"true" dır, bu yüzden pratikte bu testler $variable
boş olup olmadığını test eder . Ek olarak (aslında 3½ yıl sonra :-)) Ben asla kendimi kullanmak istiyorum çünkü -z
muhtemelen 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.
if [ ${foo:+1} ]
then
echo "yes"
fi
yes
değişken ayarlanmışsa yazdırır . ${foo:+1}
Değişken ayarlandığında 1, aksi takdirde boş dize döndürür.
set -u
seçenek ( nounset
) etkinleştirildiğinde bile çalışabilmesidir. Bu soruya hemen hemen tüm diğer cevaplar unbound variable
bu durumda başarısız olacaktır .
:+
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}
if [[ "$variable" == "" ]] ...
[ "$variable" ] || echo empty
: ${variable="value_to_set_if_unset"}
${variable:-default_value}
[ "$variable" ] || exit
true
Bir 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
elif !
yerine else
?
! [ -z "$MyVar" ]
, değişkenin içinde bir şey olacağı anlamına gelir . Ama ideal olarak kullanmak gerekir else
.
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:
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.
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 -u
ayarlanmamış 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 .