Операторы bash


Условный оператор if/elif/else

Синтаксис:

if [ x != 10 ]
then
    action
elif [ x != 12 ]
then
    action
else
    action
fi
if ! grep -r name /home
then
    echo 'Ничего не найдено в папке /home'
elif grep -r name /var
then
c
else
    echo 'Ничего не найдено в папке /home'
fi

Условный оператор if проверяет код завершения любой команды, а не только
результат выражения, заключенного в квадратные скобки.

null ":" - всегда возвращает "истина" если нужно оcтавить незаполненным части оператора if

if cmp a b &> /dev/null # Подавление вывода.
f [ $condition1 ] && [ $condition2 ]
# То же самое, что: if [ $condition1 -a $condition2 ]
# Возвращает true если оба операнда condition1 и condition2 истинны..

Эта конструкция работает так же, как в других языках программирования.
Сначала выполняются команды из списка1 . Если этот список выполнен
успешно, то есть с кодом завершения 0, то выполняется список2, если
нет — то список, стоящий после очередного elif. При невозможности
выполнить список команд, стоящий после очередного then, выполняется
список, стоящий после else.

Можно использовать сокращенный вариант, только if-then-fi:

$ if [ $? -ne 0 ] ; then echo "Ошибка. Смотри протокол"; fi;

Условные операторы case

case значение in
    шаблон1)
        список1
    ;;
    шаблон2|шаблонЗ)
        список2
    ;;
esac
case "$Keypress" in
    [a-z])
        echo "буква в нижнем регистре"
    ;;
    [A-Z])
        echo "Буква в верхнем регистре"
    ;;
    [0-9])
        echo "Цифра"
    ;;
    *)
        echo "Знак пунктуации, пробел или что-то другое"
    ;;
esac

Допускается указывать диапазоны символов в [квадратных скобках].

Ищется первый шаблон, совпадающий со значением. Если он найден, то выполняется соответствующий ему список команд, завершенный двумя символами «;». Шаблон и список разделяются символом «)». Одному списку команд может соответствовать несколько шаблонов, тогда они разделяются символом «|».

Оператор цикла с перечислением for

Синтаксис:

for переменная [in шаблон]
do
    список
done

Примеры:

for i in {1..5}
do
    echo "Welcom $i times"
done

for i in {0..10..2}
do
    echo "Welcom $i times"
done

for I in {1..10}; do echo $I; done

for I in 1 2 3 4 5 6 7 8 9 10; do echo $I; done

for I in $(seq 1 10); do echo $I; done

for ((I=1; I <= 10 ; I++)); do echo $I; done
for ((I=1; I <= 29 ; I++)); do
echo `printf "node%02d\n" $I`;
done

В результате подстановки шаблона получается список слов. Переменная
получает значение первого слова из этого списка, и выполняется список
команд, стоящий между do и done. Затем переменная получает значение
очередного слова из списка слов, и снова выполняется список команд.

Повторение прекращается по исчерпании слов в списке. Отсутствие
конструкции [in шаблон] эквивалентно записи in $@

Оператор цикла с условием while

Синтаксис:

while список1
do
    список2
done

Оператор выполняет список1 и в случае его успешного завершения (нулевого кода возврата) — список2.

Процедура повторяется до тех пор, пока результат выполнения списка1 не станет ненулевым

Оператор цикла с инверсным условием until

Синтаксис:

until СПИСОК1
do
    список2
done

Оператор выполняет список1 и, если он выполнен неуспешно (код возврата ненулевой),
то выполняет список2. Процедура повторяется до техпор, пока результат выполнения списка1 не станет нулевым.

Оператор цикла с выбором select

Синтаксис:

select переменная [in шаблон]
do
    список
done

В результате подстановки шаблона получается список слов. К этим словам
оператор добавляет порядковые номера и выводит весь набор в стандартный
поток ошибок (stderr).

Если шаблон опущен, то вместо него используется список позиционных параметров $@.
После этого оболочка выводит приглашение и считывает строку из стандартного потока ввода (stdin).

Если строка содержит номер, соответствующий какому-либо слову из списка, то переменная получает это слово в качестве значения.

Если в строке подходящего номера нет, то значением переменной становится пустая строка.
После этого выполняется список команд, и процедура повторяется до тех пор, пока в строке ввода не встретится символ конца файла (введите Ctrl+D)
или пока в списке команд не встретится команда break или return.

Функции

Оператор определения функции имеет следующий синтаксис:

[function] имя()
{
список
}

Определять функцию можно в любом месте сценария, но вызов ее должен осуществляться строго после описания.
Вызывается функция подобно любой команде — по имени.

Переданные ей аргументы в теле функции рассматриваются как позиционные параметры, причем в вызывающем
сценарии значения позиционных параметров не меняются. Значение позиционного параметра 0 — это имя функции.