Sprawdziłem to za pomocą 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
i 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
W tym drugim przypadku potrzebujesz następującej konstrukcji:
${array[@]:+${array[@]}}
aby nie zawiodła na pustej lub nieuzbrojonej tablicy. Tak, jeśli robisz tak set -eu
jak zwykle. Zapewnia to bardziej rygorystyczne sprawdzanie błędów. Z dokumentów :
-mi
Wyjdź natychmiast, jeśli potok (patrz Rurociągi), który może składać się z pojedynczego prostego polecenia (patrz Proste polecenia), listy (patrz Listy) lub polecenia złożonego (patrz Polecenia złożone) zwraca stan niezerowy. Powłoka nie kończy działania, jeśli polecenie, które się nie powiedzie, jest częścią listy poleceń bezpośrednio po słowie kluczowym chwilę lub do, część testu w instrukcji if, część dowolnego polecenia wykonanego w && lub || lista oprócz polecenia następującego po ostatnim && lub ||, dowolne polecenie w potoku, ale ostatnie, lub jeśli status zwracany polecenia jest odwracany za pomocą! Jeśli polecenie złożone inne niż podpowłoka zwraca stan niezerowy, ponieważ polecenie nie powiodło się podczas ignorowania -e, powłoka nie kończy działania. Pułapka na ERR, jeśli jest ustawiona, jest wykonywana przed wyjściem powłoki.
Ta opcja dotyczy środowiska powłoki i każdego środowiska podpowłoki osobno (patrz Środowisko wykonywania poleceń) i może spowodować zamknięcie podpowłoki przed wykonaniem wszystkich poleceń w podpowłoce.
Jeśli polecenie złożone lub funkcja powłoki jest wykonywana w kontekście, w którym ignorowane jest -e, żadne z poleceń wykonanych w ramach polecenia złożonego lub treści funkcji nie będzie miało wpływu na ustawienie -e, nawet jeśli -e jest ustawione, a polecenie zwraca status awarii. Jeśli polecenie złożone lub funkcja powłoki ustawi -e podczas wykonywania w kontekście, w którym -e jest ignorowane, ustawienie to nie będzie miało żadnego efektu, dopóki polecenie złożone lub polecenie zawierające wywołanie funkcji nie zostanie zakończone.
-u
Nieprzetworzone zmienne i parametry inne niż parametry specjalne „@” lub „*” traktują jak błąd podczas rozszerzania parametrów. Komunikat o błędzie zostanie zapisany do standardowego błędu, a nieinteraktywna powłoka zostanie zamknięta.
Jeśli nie potrzebujesz tego, możesz pominąć :+${array[@]}
część.
Zauważ też, że konieczne jest [[
tutaj korzystanie z operatora, ponieważ [
otrzymasz:
$ 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
=
jest to operator łańcuchowy. Zdarza się, że w tym przypadku działa dobrze, ale-eq
zamiast tego użyłbym właściwego operatora arytmetycznego (na wypadek, gdyby chciałem przełączyć na-ge
lub-lt
, itp.).