Операторы
Терминатором (признаком конца) для условного оператора if служит оператор fi. Для образования цепочки if-операторов можно использовать ключевое слово elif, означающее "else if".
if [ $base -eq 1 ] && [ $dm -eq 1 ]; then
installDMBase
elif [ $base -ne 1 ] && [ $dm -eq 1 ]; then
installBase
elif [ $base -eq 1 ] && [ $dm -ne 1 ]; then
installDM
else
echo '==> Installing nothing'
fi
Как и специальный -синтаксис для выполнения операций сравнения, так и ключеподобные имена операторов целочисленного сравнения (например -eq) происходят от использования утилиты /bin/test старых оболочек. В действительности квадратные скобки – это не что иное, как условное обозначение вызова утилиты test; они не являются частью оператора if.
Ниже (Таблица 24) собраны bash-операторы сравнения для чисел и строк. В отличие от Perl, в bash используются текстовые операторы для чисел и символические операторы для строк.
В оболочке bash предусмотрены возможности оценки свойств файлов. Некоторые из операторов тестирования и сравнения файлов приведены ниже (Таблица 25).
Несмотря на всю полезность формы elif, зачастую лучше (с точки зрения ясности программного кода) использовать case-структуру выбора варианта. Ниже показан ее синтаксис на примере функции, которая централизирует процесс регистрации сообщений для сценария. Конкретные варианты описываются закрывающими скобками после каждого условия и двумя точками с запятой, завершающими блок операторов, который должен быть выполнен при реализации заданного условия. Оператор case завершается ключевым словом esac.
Уровень протоколирования устанавливается в глобальной
переменной LOG_LEVEL. Возможные варианты перечислены в порядке
от самого строгого до наименее строгого: Error, Warning, Info и Debug.
function logMsg {
message_level-$l
message_itself=$2
if [ $message_level -le $LOG_LEVEL ]; then
case $message_level in
0) message_level_text="Error" ;;
1) message_level_text="Warning" ;;
2) message_level_text="Info" ;;
3) message_level_text="Debug" ;;
*) message_level_text="Other"
esac
echo "${message_level_text}: $message_itself"
fi
}
Эта функция иллюстрирует общепринятую парадигму уровня регистрации (log level), используемую многими приложениями административного характера. Код этого сценария позволяет генерировать сообщения на различных уровнях детализации, но действительно регистрируются или отрабатываются только те из них, которые проходят глобально устанавливаемый порог $LOG_LEVEL. Чтобы прояснить важность каждого сообщения, его текст предваряется меткой, описывающей соответствующий уровень регистрации.