Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
unix_shell_lab2.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
263 Кб
Скачать
☆
      1. Конструкции языка 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]#