Операторы 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 — это имя функции.