Я перевірив це за допомогою 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
як я зазвичай роблю. Це передбачає більш чітку перевірку помилок. З документів :
-е
Вийдіть негайно, якщо трубопровід (див. Трубопроводи), який може складатися з однієї простої команди (див. Прості команди), списку (див. Списки) або складної команди (див. Складені команди) повертає ненульовий статус. Оболонка не виходить, якщо команда, яка не вдається, є частиною списку команд відразу після деякого часу або до появи ключового слова, частина тесту в операторі if, частина будь-якої команди, виконаної в && або || список, за винятком команди після остаточного && або ||, будь-якої команди в конвеєрі, але останньої, або якщо стан повернення команди інвертується !. Якщо складна команда, яка не є допоміжною оболонкою, повертає ненульовий статус, оскільки команда не вдалася, коли -e ігнорувався, оболонка не виходить. Папка на ERR, якщо вона встановлена, виконується до виходу оболонки.
Ця опція застосовується до середовища оболонки та кожного середовища підшалі окремо (див. Середовище виконання команд) та може призвести до того, що підпускові оболонки вийдуть перед виконанням всіх команд в підкашлі.
Якщо складена команда або функція оболонки виконується в контексті, де -e ігнорується, жодна з команд, виконаних у складеній команді або тілі функції, не впливатиме на налаштування -e, навіть якщо встановлено -e і команда повертає a статус відмови. Якщо команда або функція оболонки встановлює -e під час виконання в контексті, де -e ігнорується, це налаштування не матиме жодного ефекту, поки не завершиться складна команда або команда, що містить виклик функції.
-у
Розгляньте невстановлені змінні та параметри, відмінні від спеціальних параметрів "@" або "*", як помилку при виконанні розширення параметра. Повідомлення про помилку буде записано на стандартну помилку, і неінтерактивна оболонка вийде.
Якщо вам це не потрібно, сміливо пропустіть :+${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
тощо).