Проверка условий в bash

15.04.2015
Часто при написании скриптов под bash необходимо проверять результаты выполнения тех или иных команд.

Это немного подправленная выдержка из этой статьи.

Скобки

[ — является специальной встроенной командой test воспринимающей свои аргументы как выражение сравнения или файловую проверку […..].

[[ — расширенный вариант от «[«, является зарезервированным словом, а не командой, его bash выполняет как один элемент с кодом возврата. Внутри «[[….]]» разрешается выполнение операторов &&, || которые приводят к ошибке в обычных скобках «[….]» тем самым вариант с двойной скобкой более универсален.

(( — является арифметическими выражениями, которое так же возвращают код 0. Тем самым такие выражения могут участвовать в операциях сравнения.

Приведу список логических операторов, которые используются для if|then|else:

-z – строка пуста

-n – строка не пуста

=, ( == ) – строки равны

!= – строки неравны

-eq – равно

-ne – неравно

-lt,(< ) – меньше

-le,(<=) – меньше или равно

-gt,(>) – больше

-ge,(>=) - больше или равно

! - отрицание логического выражения

-a,(&&) – логическое «И»

-o,(||) -логическое «ИЛИ»

Конструкции простой проверки if|then

1
2
3
if [[ condition ]]; then
commands
fi

Другими словами:

если проверяемое_выражение_или_команды_верны; то выполняем команды закрываем если

Пример 1

1
2
3
4
#!/bin/bash
if echo Тест; then 
echo 0 
fi

Часто встречается в скриптах проверка — «существует ли файлы или каталоги» на их примере покажу работу

Пример 2

1
2
3
4
#!/bin/bash 
if [ -f $HOME/.bashrc ]; then 
echo "Файл существует!"
fi

где:

$HOME/.bashrc – путь до файла
echo – печатает сообщение в консоль

Пример 3

1
2
3
4
#!/bin/bash
if [[ -f $HOME/.bashrc && -f /usr/bin/nano ]]; then 
echo "Все впорядке, можно редактировать!" 
fi

где:

&& - логическое «и», если первый путь «истина» проверяем второй, если он тоже «истина», то выполняем команды (echo)
-f – ключ проверки на существования файла (о них чуть ниже)

Конструкции простой проверки if|then|else

1
2
3
4
5
if [[ condition ]]; then 
    commands 1 
else 
    commands 2 
fi

другими словами:

если проверяемое_выражение_или_команды_верны; то команды 1 иначе команды 2 закрываем если

Пример 4

Возможно не лучший пример, нас интересует именно ответ 0 или 1. В результате печатается в консоль «Тест» и «0» потому что команда «echo Тест» успешна и это «истина».

1
2
3
4
5
6
#!/bin/bash 
if echo Тест; 
    then echo 0 
else 
    echo 1 
fi

Намерено допустите ошибку изменив echo, в результате получите «1» и сообщение о том что «команда echo не существует» и это «ложь».

1
2
3
4
5
6
#!/bin/bash 
if echo Тест; then 
    echo 0 
else 
    echo 1 
fi

Примеры «существуют ли файл?»

Пример 5

Если файл bashrc существует, то печатает в консоль «Файл существует!», иначе печатает «Файл не существует!»

1
2
3
4
5
6
#!/bin/bash 
if [ -f "$HOME/.bashrc" ]; then 
    echo "Файл существует!" 
else 
    echo "Файл не существует!" 
fi

Поиграйте с именем проверяемого файла

Пример 6

1
2
3
4
5
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» печатаем «Да».

1
2
3
4
#!/bin/bash 
if (( 3 < 6));then 
    echo Да 
fi

Пример 8

Использование команды test, коей являются квадратные скобки. Если «3» меньше «6» печатаем «Да».

1
2
3
#!/bin/bash if [ 3 -lt 6 ]; then 
    echo Да 
fi

Можно использовать и двойные квадратные скобки, это расширенный вариант команды test, эквивалентом которой является «[ ]». Если «3» меньше «6» печатаем «Да».

1
2
3
4
#!/bin/bash 
if [[ 3 -lt 6 ]]; then 
    echo Да 
fi

Пример 9

Используем двойные квадратные скобки, потому что применяем оператор «&&». Если первое выражение 2 = 2 (истина) тогда выполняем второе, и если оно тоже 2=2 (истина), печатаем «Верно»

1
2
3
4
5
6
7
8
#!/bin/bash 
a="2" 
b="2" 
if [[ 2 = "$a" && 2 = "$b" ]] ; then 
    echo Верно 
else 
    echo Не верно 
fi

Если первое выражение 2 = 2 (истина) тогда выполняем второе, и если переменная «b» не равна двум (ложь), печатаем «Не верно»

1
2
3
4
5
6
7
8
#!/bin/bash 
a="2" 
b="3" 
if [[ 2 = "$a" && 2 = "$b" ]] ; then 
    echo Верно 
else 
    echo Не верно 
fi

Можно конечно сделать проще, нам главное понять принцип if|then и else, не стесняйтесь менять, подставляя свои значения.

Вложение нескольких проверок

Bash позволяет вкладывать в блок несколько блоков

1
2
3
4
5
6
7
8
9
10
#!/bin/bash 
if [[ condition 1 ]]; then 
    if [[ condition 2 ]]; then 
        command 1 
    else 
        command 2 
    fi 
else 
    command 3 
fi

Построения многоярусных конструкций

Для построения многоярусных конструкции, когда необходимо выполнять множество проверок лучше использовать elif — это краткая форма записи конструкции else if.

1
2
3
4
5
6
7
8
9
if [[ condition 1 ]]; then 
    command 1 
    command 2 
elif [[ condition 2 ]]; then 
    command 3 
    command 4 
else 
    command 5 
fi


Категории: Linux, Centos
Яндекс.Метрика