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 testarkadaşın.
./test.ksh[8]: test: argument expectedneden dunnot alıyorum ama tek parantez işe yaramadı ama çift bir tane vardı.
if test -z "$var", değil mi?
set -useç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
-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.
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 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.
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.
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 .
:+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
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
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 -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 .