Я проверил это с 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
и 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
В последнем случае вам понадобится следующая конструкция:
${array[@]:+${array[@]}}
для того, чтобы он не потерпел неудачу на пустом или неустановленном массиве. Это если ты делаешь так, set -eu
как я обычно делаю. Это обеспечивает более строгую проверку ошибок. Из документов :
-e
Немедленно завершите работу, если конвейер (см. Конвейеры), который может состоять из одной простой команды (см. Простые команды), списка (см. Списки) или составной команды (см. Составные команды), возвращает ненулевое состояние. Оболочка не завершает работу, если сбойная команда является частью списка команд, следующих сразу за ключевым словом некоторое время или до, часть теста в операторе if, часть любой команды, выполняемой в && или || список, за исключением команды, следующей за последним символом && или ||, любой команды в конвейере, кроме последней, или если статус возврата команды инвертируется с!. Если составная команда, отличная от подоболочки, возвращает ненулевое состояние из-за сбоя команды, когда -e игнорировалась, оболочка не завершается. Ловушка ERR, если установлена, выполняется до выхода из оболочки.
Этот параметр применяется к среде оболочки и к каждой среде подоболочки отдельно (см. Среду выполнения команд) и может привести к выходу подоболочек перед выполнением всех команд в подоболочке.
Если составная команда или функция оболочки выполняется в контексте, где -e игнорируется, ни одна из команд, выполненных в составной команде или теле функции, не будет затронута параметром -e, даже если -e установлено и команда возвращает статус отказа. Если составная команда или функция оболочки устанавливает -e при выполнении в контексте, где -e игнорируется, этот параметр не будет иметь никакого эффекта, пока составная команда или команда, содержащая вызов функции, не завершится.
-u
Обрабатывайте неустановленные переменные и параметры, кроме специальных параметров '@' или '*', как ошибку при выполнении расширения параметра. Сообщение об ошибке будет записано в стандартную ошибку, и неинтерактивная оболочка завершится.
Если вам это не нужно, не стесняйтесь пропустить :+${array[@]}
часть.
Также обратите внимание, что здесь важно использовать [[
оператор, так как [
вы получаете:
$ 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
=
это строковый оператор. В этом случае это работает нормально, но-eq
вместо этого я бы использовал правильный арифметический оператор (на всякий случай, если бы я хотел переключиться на-ge
или-lt
и т. Д.).