При создании shell-скриптов часто возникает необходимость проверки каких-то условий. Самым простым оператором для этого является if / then / else. Конструкцию if / then всегда необходимо заканчивать словом fi.
if [ выражение ]; then оператор1; else оператор2; fi
Принцип работы его заключается в следующем: проверяется условие в if, если выражение условия возвращает код завершения 0 (истинно), то выполняется оператор после then (оператор1); если код завершения отличен от нуля (ложно), то выполняется альтернативное действие после else (оператор2) или выход из условия fi в случае отсутствия необязательного условия else.
Условия могут быть вложенными друг в друга; условия могут состоять из нескольких выражений, объединенных логическими операциями И / ИЛИ. При написании условий рекомендуется использовать двойные квадратные кавычки [[,]] для обрамления выражений. В противном случае возникает ошибка интерпретатора, требующая экранирования знаков вроде «<» с помощью специального символа «\».
Структуры «И» / «ИЛИ»
-a логическое И (and) -o логическое ИЛИ (or)
Например
if [ "$a" = "$b" -a "$c" = "$d" ]; then echo "Оба выражения истинны" fi
Инвертирование результата
if [ ! -f "/home/user/file" ]; then echo "Файл не найден" fi
Сравнение чисел
При сравнении чисел используются операторы, являющиеся англоязычными сокращениями:
-eq равно (equal) -ne не равно (not equal) -lt меньше (less) -le меньше или равно (less than or equal) -gt больше (greater) -ge больше или равно (greater)
Например:
if [ "$b" -gt "$a" ]; then echo "Переменная b больше, чем a" fi
Сравнение строк
При сравнении строк используются привычные операторы:
= равно == тоже равно != не равно < меньше > больше
Например:
if [ "$a" = "mystring" ]; then echo "равно" fi
Кроме математических выражений, для строк доступны следующие условия:
string строка не нулевая или не определена -n string строка не нулевая и существует -z string строка нулевая и существует
Например:
if [ $var ] then echo "Содержимое строки: $var" else echo "Строка пустая или не существует" fi
Работа с файловой системой
Следующие условия помогут при работе с файлами:
-b file файл существует и это block special file (например, CD-ROM или HDD) -c file файл существует и это character special file (например, клавиатура или мышь) -d file файл существует и это директория -e file файл существует -f file файл существует и это регулярный файл (не директория) -g file файл существует и у него установлен set-group-id бит -h file файл существует и это симлинк -k file файл существует и у него установлен sticky бит -p file файл существует и это named-pipe -r file файл существует и доступен для чтения -s file файл существует и его размер отличен от нуля -t fd файловый дескриптор fd открыт и направлен в консоль -u file файл существует и у него установлен set-user-id бит -w file файл существует и доступен на запись -x file файл существует и является исполняемым -O file файл существует и принадлежит существующему пользователю -G file файл существует и принадлежит существующей группе -L file файл существует и это симлинк -S file файл существует и это сокет -N file файл существует и был изменен с последнего прочтения file1 -nt file2 файл file1 изменялся чаще чем file2, или file1 существует, а file2 нет file1 -ot file2 файл file1 старше чем file2, или file1 существует, а file2 нет file1 -ef file2 файлы file1 и file2 относятся к одному устройству и номеру инода -o OPTIONNAME shell опция "OPTIONNAME" включена
Допускается отсутствие служебных слов if / then:
[[ "$var1" -ne "$var2" ]] && echo "$var1 не равно $var2"
Допускается использование оператора test, который служит для проверки состояния файлов, сравнения строк и арифметических сравнений:
test 5 -gt 2 && echo "Yes" test -f /etc/resolv1.conf && echo "File /etc/resolv1.conf found." || echo "File /etc/resolv1.conf not found."
Ссылки: