- •§2 Unix Shell – лабораторные работы
- •Лабораторная работа №2: Написание скриптов. Практика использования Unix Shell. Обработка журнальных файлов.
- •Некоторые базовые элементы и средства языка Unix Shell
- •Конструкции языка Shell
- •Написание скриптов Unix Shell
- •Exit – завершение скрипта и выход. В качестве необязательного параметра можно указать код возврата. Подробнее см. Man exit.
- •Задание для выполнения лаб. Работы №2
- •Контрольные вопросы
Конструкции языка Shell
Условный оператор
Условный оператор имеет следующий синтаксис:
if <list1>; then <list2>; [ elif <list3>; then <list4>; ] ... [ else <listN>; ] fi
Сначала выполняются команды из списка list1, если код возврата последней команды из list1 = 0, тогда выполняются команды из списка list2, иначе (при наличии соответствующих ветвей) управление передается далее на elif(ы) или else.
Пример:
if [ "${VIRTUAL}" != "" ];
then
echo "${VIRTUAL}"
else
echo "${user}"
exit 2
fi
(Если значение переменной VIRTUAL не равно пустой строке (проверяется при помощи команды варианта команды test – программы с именем “[”, см. информацию по test ниже или man test), тогда вывести на экран значение переменной VIRTUAL, иначе вывести на экран значение переменной user и затем завершить скрипт с кодом возврата = 2 )
Оператор выбора
Синтаксис: case <word> in [ [(] <pattern> [ | <pattern> ] ... ) <list> ;; ] ... esac
Описание: Если значение word соответствует одному из шаблонов pattern, то выполняется соответствующий список команд list и т.д.
Пример:
case ${RET} in
[1]) RET="$RET день"
;;
[234]) RET="$RET дня"
;;
[567]) RET="$RET дней"
esac
(Если RET = 1, тогда добавить к переменной RET окончание “день”, если RET равно 2 или 3 или 4, тогда добавить окончание “дня” и т.д.)
Оператор цикла for
Синтаксис1: for (( expr1 ; expr2 ; expr3 )) ; do list ; done
Описание: Работает подобно циклу for в языке C/C++
Синтаксис2: for <name> [ in <word> ] ; do <list> ; done
Описание: переменная name последовательно принимает значения из списка word, каждый раз при этом выполняется список команд list.
Пример:
[root@bublik /home/mike]# for ((i=1;i<=3;i++)); do echo ${i}; done
1
2
3
[root@bublik /home/mike]# for i in 1 2 3; do echo ${i}; done
1
2
3
[root@bublik /home/mike]#
Оператор цикла while
Синтаксис: while <list1>; do <list2>; done
Описание: Цикл с предусловием: сначала выполняются команды списка list1 («условие цикла»), если статус последней команды = 0, то выполняются команды списока list2 («тело цикла») и т.д. в цикле до тех пор, пока статус завершения list1 не станет ненулевым.
Пример:
[root@bublik /home/mike]# a=1; while [ ${a} -le 3 ]; do echo ${a}; a=$[${a}+1]; done
1
2
3
[root@bublik /home/mike]#
(Пока значение переменной “a” меньше или равно трем, выполнять тело цикла. Проверка осуществляется при помощи “[” – варианта программы test. см. man test или информацию по test ниже)
Операторы “;”, “&&”,” ||”, “()”, “{}”
Знаки ;, && и || предназначены для соединения нескольких команд в одну цепочку. При этом:
Если команды перечислены подряд с разделителем “;”, то они будут выполнены подряд одна за другой, при этом при выполнении следующей команды в цепочке Shell игнорирует статус завершения предыдущей (с ошибкой или нет – не важно)
Если команды перечислены подряд с разделителем “&&”, то они будут выполнены подряд одна за другой, при этом Shell выполняет следующую команду в цепочке только в том случае, если предыдущая завершилась успешно (код возврата = 0)
Если команды перечислены подряд с разделителем “||”, то они будут выполнены подряд одна за другой, при этом Shell выполняет следующую команду в цепочке только в том случае, если предыдущая завершилась неуспешно (код возврата не равен 0)
Примеры:
[root@bublik /home/mike]# a=0; [ ${a} == "1" ] && echo "YES" || echo "NO"
NO
[root@bublik /home/mike]# a=1; [ ${a} == "1" ] && echo "YES" || echo "NO"
YES
[root@bublik /home/mike]#
Применение скобок:
Команды, заключенные в фигурные скобки {} группируются (подобно тому, как в C/C++).
Команды, заключенные в круглые скобки () группируются и выполняются в отдельной («дочерней») копии Shell (см. материал про команду export выше!).
Группирование удобно использовать, например, для объединения и накопления данных с stdout от всех объединенных команд (программ) с целью использовать объединенный поток данных дальше, например, передав его через конвейер другой программе или перенаправив в файл. Без группирования перенаправление необходимо применять к КАЖДОЙ отдельной команде, а конвейер и вовсе использовать затруднительно.
Примеры:
(Выполним вывод двух строк двумя командами echo, выполненными последовательно одна за другой)
[root@bublik /home/mike]# echo "test1"; echo "test2"
test1
test2
(Если этот вывод необходимо перенаправить в файл, то без применения скобок придется перенаправлять вывод КАЖДОЙ команды)
[root@bublik /home/mike]# echo "test1" >file.txt; echo "test2" >>file.txt
[root@bublik /home/mike]# cat file.txt
test1
test2
(Если без применения объединяющих скобок использовать перенаправление в конце, то в файл будет перенаправлен вывод последней команды. Первая команда выдаст информацию на консоль)
[root@bublik /home/mike]# echo "test1"; echo "test2" >file.txt
test1
[root@bublik /home/mike]# cat file.txt
test2
(При объединении команд скобками их вывод «склеивается», «объединяется», что можно продемонстрировать, применив ОДИН РАЗ перенаправление ко всему блоку команд)
[root@bublik /home/mike]# ( echo "test1"; echo "test2" ) >file.txt
[root@bublik /home/mike]# cat file.txt
test1
test2
(Аналогично применяем конвейер вместо перенаправления информации в файл)
[root@bublik /home/mike]# ( echo "test1"; echo "test2" ) | wc -c
12
[root@bublik /home/mike]#
