Şunu kontrol ettim bash-4.4.0
:
#!/usr/bin/env bash
set -eu
check() {
if [[ ${array[@]} ]]; then
echo not empty
else
echo empty
fi
}
check # empty
array=(a b c d)
check # not empty
array=()
check # empty
ve bash-4.1.5
:
#!/usr/bin/env bash
set -eu
check() {
if [[ ${array[@]:+${array[@]}} ]]; then
echo non-empty
else
echo empty
fi
}
check # empty
array=(a b c d)
check # not empty
array=()
check # empty
İkinci durumda, aşağıdaki yapıya ihtiyacınız vardır:
${array[@]:+${array[@]}}
boş veya ayarlanmamış dizide başarısız olmamak için. set -eu
Genelde benim yaptığım gibi yaparsan. Bu daha katı hata kontrolü sağlar. Gönderen docs :
-e
Tek bir basit komuttan (bkz. Basit Komutlar), bir listeden (bkz. Listeler) veya bir bileşik komuttan (bkz. Bileşik Komutlar) sıfırdan farklı bir durumdan oluşan bir boru hattı (bkz. Boru Hatları). Başarısız olan komut, bir süre sonra veya anahtar kelimeye kadar hemen ardından komut listesinin bir parçasıysa, bir if ifadesinde testin bir parçası, & & veya || final && veya || komutunu takip eden komut hariç, bir boru hattındaki herhangi bir komuttan başka bir komut yoksa veya komutun geri dönüş durumu! Alt kabuk dışındaki bir bileşik komut sıfır olmayan bir durum verirse -e ihmal edilirken bir komut başarısız olursa, kabuk çıkmaz. Kabuk çıkmadan önce, eğer ayarlanmışsa, ERR'deki bir tuzak yürütülür.
Bu seçenek kabuk ortamı ve her alt kabuk ortamı için ayrı ayrı uygulanır (bkz. Komut Yürütme Ortamı) ve alt kabuktaki tüm komutları çalıştırmadan önce alt kabukların çıkmasına neden olabilir.
Bir bileşik komut veya kabuk işlevi, -e'nin yoksayıldığı bir bağlamda yürütülürse, bileşik komut veya işlev gövdesinde yürütülen komutların hiçbiri, -e ayarlanmış olsa bile bir komut -e ayarından etkilenmez. başarısızlık durumu. Bir bileşik komut veya kabuk işlevi, -e'nin yoksayıldığı bir bağlamda yürütülürken -e ayarlarsa, bu ayar, bileşik komut veya işlev çağrısını içeren komut tamamlanıncaya kadar etkili olmaz.
-u
Parametre genişletme yaparken, ayarlanmamış değişkenleri ve '@' veya '*' özel parametreleri dışındaki parametreleri hata olarak kabul edin. Standart hataya bir hata mesajı yazılacak ve etkileşimli olmayan bir kabuk çıkacaktır.
Buna ihtiyacınız yoksa, atlamaktan çekinmeyin :+${array[@]}
.
Ayrıca, [[
burada operatörün kullanmanın şart olduğunu unutmayın [
:
$ cat 1.sh
#!/usr/bin/env bash
set -eu
array=(a b c d)
if [ "${array[@]}" ]; then
echo non-empty
else
echo empty
fi
$ ./1.sh
_/1.sh: line 4: [: too many arguments
empty
=
bir string operatör olduğunu unutmayın . Bu durumda iyi çalışır, ancak-eq
bunun yerine uygun aritmetik operatörünü kullanırdım (sadece-ge
veya-lt
vb. Arasında geçiş yapmak istersem ).