Проверка условий в bash
Это немного подправленная выдержка из этой статьи.
Скобки
[ — является специальной встроенной командой test воспринимающей свои аргументы как выражение сравнения или файловую проверку […..].
[[ — расширенный вариант от «[«, является зарезервированным словом, а не командой, его bash выполняет как один элемент с кодом возврата. Внутри «[[….]]» разрешается выполнение операторов &&, || которые приводят к ошибке в обычных скобках «[….]» тем самым вариант с двойной скобкой более универсален.
(( — является арифметическими выражениями, которое так же возвращают код 0. Тем самым такие выражения могут участвовать в операциях сравнения.
Приведу список логических операторов, которые используются для if|then|else:
-z – строка пуста
-n – строка не пуста
=, ( == ) – строки равны
!= – строки неравны
-eq – равно
-ne – неравно
-lt,(< ) – меньше
-le,(<=) – меньше или равно
-gt,(>) – больше
-ge,(>=) - больше или равно
! - отрицание логического выражения
-a,(&&) – логическое «И»
-o,(||) -логическое «ИЛИ»
Конструкции простой проверки if|then
1 |
if [[ condition ]]; then commands fi |
Другими словами:
если проверяемое_выражение_или_команды_верны; то выполняем команды закрываем если
Пример 1
1 |
#!/bin/bash if echo Тест; then echo 0 fi |
Часто встречается в скриптах проверка — «существует ли файлы или каталоги» на их примере покажу работу
Пример 2
1 |
#!/bin/bash if [ -f $HOME/.bashrc ]; then echo "Файл существует!" fi |
где:
$HOME/.bashrc – путь до файла
echo – печатает сообщение в консоль
Пример 3
1 |
#!/bin/bash if [[ -f $HOME/.bashrc && -f /usr/bin/nano ]]; then echo "Все впорядке, можно редактировать!" fi |
где:
&& - логическое «и», если первый путь «истина» проверяем второй, если он тоже «истина», то выполняем команды (echo)
-f – ключ проверки на существования файла (о них чуть ниже)
Конструкции простой проверки if|then|else
1 |
if [[ condition ]]; then commands 1 else commands 2 fi |
если проверяемое_выражение_или_команды_верны; то команды 1 иначе команды 2 закрываем если
Пример 4
Возможно не лучший пример, нас интересует именно ответ 0 или 1. В результате печатается в консоль «Тест» и «0» потому что команда «echo Тест» успешна и это «истина».
1 |
#!/bin/bash if echo Тест; then echo 0 else echo 1 fi |
Намерено допустите ошибку изменив echo, в результате получите «1» и сообщение о том что «команда echo не существует» и это «ложь».
1 |
#!/bin/bash if echo Тест; then echo 0 else echo 1 fi |
Примеры «существуют ли файл?»
Пример 5
Если файл bashrc существует, то печатает в консоль «Файл существует!», иначе печатает «Файл не существует!»
1 |
#!/bin/bash if [ -f "$HOME/.bashrc" ]; then echo "Файл существует!" else echo "Файл не существует!" fi |
Поиграйте с именем проверяемого файла
Пример 6
1 |
#!/bin/bash if [[ -f "$HOME/.bashrc" && -f "/usr/bin/nano" ]]; then echo "Все в порядке, можно редактировать!" else echo "Ошибка!" fi |
Ключи к файлам и каталогам
[ -ключ “путь” ]
[ -e “путь каталогу_или_файлу”] – существует ли файл или каталог.
[ -r “путь к файлу/каталогу”] – доступен ли файл/каталог для чтения.
[ -f “путь к файлу/каталогу”] – существует ли файл.
[ -d “путь к каталогу”] – существует ли каталог.
Полное описание возможных применений различных скобок, правильное расставление кавычек уходит далеко от темы, поэтому могу посоветовать обратится к руководству Advanced Bash Scripting
Арифметика
Пример 7
Если оператор > использовать внутри [[….]], он рассматривается как оператор сравнения строк, а не чисел. Поэтому операторам > и < для сравнения чисел лучше заключить в круглые скобки.
Используем круглые скобки для математического сравнение. Если «3» меньше «6» печатаем «Да».
1 |
#!/bin/bash if (( 3 < 6));then echo Да fi |
Пример 8
Использование команды test, коей являются квадратные скобки. Если «3» меньше «6» печатаем «Да».
1 |
#!/bin/bash if [ 3 -lt 6 ]; then echo Да fi |
Можно использовать и двойные квадратные скобки, это расширенный вариант команды test, эквивалентом которой является «[ ]». Если «3» меньше «6» печатаем «Да».
1 |
#!/bin/bash if [[ 3 -lt 6 ]]; then echo Да fi |
Пример 9
Используем двойные квадратные скобки, потому что применяем оператор «&&». Если первое выражение 2 = 2 (истина) тогда выполняем второе, и если оно тоже 2=2 (истина), печатаем «Верно»
1 |
#!/bin/bash a="2" b="2" if [[ 2 = "$a" && 2 = "$b" ]] ; then echo Верно else echo Не верно fi |
Если первое выражение 2 = 2 (истина) тогда выполняем второе, и если переменная «b» не равна двум (ложь), печатаем «Не верно»
1 |
#!/bin/bash a="2" b="3" if [[ 2 = "$a" && 2 = "$b" ]] ; then echo Верно else echo Не верно fi |
Можно конечно сделать проще, нам главное понять принцип if|then и else, не стесняйтесь менять, подставляя свои значения.
Вложение нескольких проверок
Bash позволяет вкладывать в блок несколько блоков
1 |
#!/bin/bash if [[ condition 1 ]]; then if [[ condition 2 ]]; then command 1 else command 2 fi else command 3 fi |
Построения многоярусных конструкций
Для построения многоярусных конструкции, когда необходимо выполнять множество проверок лучше использовать elif — это краткая форма записи конструкции else if.
1 |
if [[ condition 1 ]]; then command 1 command 2 elif [[ condition 2 ]]; then command 3 command 4 else command 5 fi |