Проверка условий в bash
Written by Fiercemix
Category: Bash
Published: 05 March 2014
Hits: 9722
Операторы if | then и else.
Операторы if | then проверяют код завершения списка команд на «успешное завершение(истина)» что в свою очередь означает «0», и если это так, то выполняет одну или более команд следующих за словом then. Если проверка возвращает «не успешное завершение (ложь)» что в свою очередь означает «1» выполняется else «иначе» если того требует условие. В завершении условия обязательно закрываем его «fi»!
Все выше написанное возможно будет понятно не сразу, но когда дальше по статье пойдут примеры, все станет на свои места.
Скобки
[ — является специальной встроенной командой test воспринимающей свои аргументы как выражение сравнения или файловую проверку [.....].
[[ — расширенный вариант от «[«, является зарезервированным словом, а не командой, его bash выполняет как один элемент с кодом возврата. Внутри «[[....]]» разрешается выполнение операторов &&, || которые приводят к ошибке в обычных скобках «[....]» тем самым вариант с двойной скобкой более универсален.
(( — является арифметическими выражениями, которое так же возвращают код 0. Тем самым такие выражения могут участвовать в операциях сравнения.
Приведу список логических операторов, которые используются для if|then|else:
- строка пуста
-z
- строка не пуста
-n
- строки равны
=,(==)
- строки неравны
!=
- равно
-eq
- неравно
-ne
- меньше
-lt,(<)
- меньше или равно
-le,(<=)
- больше
-gt,(>)
- больше или равно
-ge,(>=)
- отрицание логического выражения
!
- логическое «И»
-a,(&&)
- логическое «ИЛИ»
-o,(||)
Конструкции простой проверки if|then
ifусловие;then
команды
fi
другими словами
если проверяемое_выражение_или_команды_верны; то
выполняемкоманды
закрываемесли
Пример 1
#!/bin/bash
if echo Тест;then
echo 0
fi
Часто встречается в скриптах проверка — «существует ли файлы или каталоги» на их примере покажу работу
Пример 2
#!/bin/bash
if[-f $HOME/.bashrc ];then
echo "Файл существует!"
fi
где
- $HOME/.bashrc — путь до файла
- echo — печатает сообщение в консоль
Пример 3
#!/bin/bash
if[[-f $HOME/.bashrc &&-f /usr/bin/nano ]];then
echo "Все впорядке, можно редактировать!"
fi
где
- && — логическое «и», если первый путь «истина» проверяем второй, если он тоже «истина», то выполняем команды (echo)
- -f — ключ проверки на существования файла (о них чуть ниже)
Конструкции простой проверки if|then|else
ifусловие;then
команды1
else
команды2
fi
другими словами
еслипроверяемое_выражение_или_команды_верны; то
команды1
иначе
команды2
закрываемесли
Пример 4
Возможно не лучший пример, нас интересует именно ответ 0 или 1. В результате печатается в консоль «Тест» и «0» потому что команда «echo Тест» успешна и это «истина».
#!/bin/bash
if echo Тест;then
echo 0
else
echo 1
fi
Намерено допустите ошибку изменив echo, в результате получите «1» и сообщение о том что «команда eho не существует» и это «ложь».
#!/bin/bash
if eho Тест;then
echo 0
else
echo 1
fi
Примеры «существуют ли файл?»
Пример 5
Если файл bashrc существует, то печатает в консоль «Файл существует!», иначе печатает «Файл не существует!»
#!/bin/bash
if[-f "$HOME/.bashrc"];then
echo "Файл существует!"
else
echo "Файл не существует!"
fi
Поиграйте с именем проверяемого файла
Пример 6
#!/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» печатаем «Да».
#!/bin/bash
if((3<6));then
echo Да
fi
Пример 8
Использование команды test коей является квадратные скобки. Если «3» меньше «6» печатаем «Да».
#!/bin/bash
if[3-lt 6];then
echo Да
fi
Можно использовать и двойные квадратные скобки, как вы наверно уже поняли это расширенный вариант команды test эквивалентом которой является «[ ]». Если «3» меньше «6» печатаем «Да».
#!/bin/bash
if[[3-lt 6]];then
echo Да
fi
Пример 9
Используем двойные квадратные скобки, потому что применяем оператор «&&». Если первое выражение 2 = 2 (истина) тогда выполняем второе, и если оно тоже 2=2 (истина), печатаем «Верно»
#!/bin/bash
a="2"
b="2"
if[[2="$a"&&2="$b"]];then
echo Верно
else
echo Неверно
fi
Если первое выражение 2 = 2 (истина) тогда выполняем второе, и если переменная «b» не равна двум (лож), печатаем «Не верно»
#!/bin/bash
a="2"
b="3"
if[[2="$a"&&2="$b"]];then
echo Верно
else
echo Неверно
fi
Можно конечно сделать проще, нам главное понять принцип if|then и else, не стесняйтесь менять подставляя свои значения.
Вложение нескольких проверок
Bash позволяет вкладывать в блок несколько блоков
#!/bin/bash
if[Условие1];then
if[Условие2];then
Команда1
else
Команда2
fi
else
Команда3
fi
Построения многоярусных конструкций
Для построения многоярусных конструкции, когда необходимо выполнять множество проверок лучше использовать elif — это краткая форма записи конструкции else if.
if[Условие1];then
Команда1
Команда2
elif[Условие2];then
Команда3
Команда4
else
Команда5
fi