Слайд 1Занятие 13
МДК.02.01 Программное обеспечение компьютерных сетей
3-курс
Слайд 2 Логические структуры командного интерпретатора
Слайд 3Логические структуры командного интерпретатора
До сих пор мы рассматривали командные
файлы, в которых команды выполнялись последовательно.
В подавляющем большинстве
случаев так не бывает.
Почти все программы реализуют алгоритмы с ветвлениями и различными переходами.
Командные файлы в этом плане не являются каким-то исключением.
Слайд 4Логические структуры командного интерпретатора
Во всех языках высокого уровня,
включая командный интерпретатор shell, есть программные конструкции, позволяющие изменять
последовательность выполнения команд в зависимости от тех или иных условий.
Их часто называют логическими структурами, и благодаря им язык командного интерпретатора приобретает особую гибкость и мощь.
Слайд 5Логические структуры командного интерпретатора
Большинство логических конструкций shell напоминает
аналогичные им логические структуры, имеющиеся в
таких языках высокого уровня, например, как С («си») или Fortran.
Практически все логические структуры командного интерпретатора используют коды завершения команд для определения дальнейшей последовательности выполнения операторов.
Слайд 6Логические структуры командного интерпретатора
Код завершения показывает, с каким результатом
выполнилась команда.
В случае удачного завершения команда возвращает 0,
В случае
неудачи выводится значение, отличное от нуля.
Код завершения команды по умолчанию не выводится на экран — чтобы его увидеть, нужно задать специальный параметр $?.
Слайд 7Логические структуры командного интерпретатора
Например:
# pwd
/root
# echo
$?
0
#
Команда pwd определяет текущий каталог, команда echo выводит на
экран код завершения команды pwd . Команда (pwd) выполнилась без ошибок, поэтому вернула значение кода ошибки, равное 0.
Слайд 8Логические структуры командного интерпретатора
Ещё один пример:
# cat filel
cat: filel: No such file or directory
# echo $?
1
#
Данный файл или каталог отсутствует. Команда cat, которая выводит содержимого файла на экран монитора, завершилась неудачно, поэтому код ошибки равен 1.
Слайд 9Логические структуры командного интерпретатора
Следует сказать, что почти все логические
структуры предназначены специально для использования в командных файлах и не
работают непосредственно в командной строке, за исключением команды test, которую мы рассматривали в начале.
Анализ логических структур командного интерпретатора shell начнем с оператора цикла for.
Слайд 10Логические структуры командного интерпретатора
В общем виде цикл for можно
представить так:
for переменная in список_переменных
do
команда_1
команда_2
…
команда_n
done
Слайд 11Логические структуры командного интерпретатора
В этой конструкции жирным шрифтом выделены
ключевые слова, которые обязательно должны присутствовать в цикле for.
Цикл
for последовательно выполняет команды, находящиеся между ключевыми словами do и done.
При этом выполняется последовательный проход по списку список_переменных и очередное выбираемое значение из этого списка присваивается переменной переменная, имя которой указано слева от ключевого слова in.
Список переменных может задаваться как символьными константами, так и дискретными значениями, разделенными пробелами.
Слайд 12Логические структуры командного интерпретатора
Следующий фрагмент программного кода демонстрирует свойства
цикла for:
for x in 100 1000 10000
do
echo "$x"
done
echo
Результатом выполнения такого цикла будет такая последовательность чисел на экране:
100
1000
10000
Слайд 13Логические структуры командного интерпретатора
Следующий фрагмент программного
кода выводит на экран список файлов
текущего каталога, размер которых отличен от нуля:
for х in *
do
test -s $x && ls -l $x
done
(test –s – не пустой)
Слайд 14Логические структуры командного интерпретатора
Переместить файлы из каталогов, указанных в
списке переменных, в другой каталог можно с помощью следующего программного
кода:
echo enter the directory path (введите путь к каталогу)
read path
test -e $path || mkdir $path
for file in dirl dir2 dir3
do
mv $file $path/$file
Done
Команда test -e $path || mkdir $path создает каталог с именем, заданным переменной path, если таковой отсутствует.
Слайд 15Логические структуры командного интерпретатора
Далее мы рассмотрим логическую структуру высокого
уровня, имеющую название оператор условия if.
Структуру оператора if в
общем виде можно представить так:
if условие
then
команда_1
команда_2
…
команда_n
fi
Слайд 16Логические структуры командного интерпретатора
Здесь условие представляет собой определенное выражение.
От
его истинности зависит, будут ли выполняться операторы, расположенные между ключевыми
словами then и fi.
Если условие является истинным, то команды будут выполняться.
Если условия ложные, то они будут пропущены.
Условие представляет собой определенное выражение, заключенное в квадратные скобки.
Слайд 17Логические структуры командного интерпретатора
Например:
[$I -gt 100 -а $I
-lе 1000]
Это выражение будет истинно, если переменная I :
больше
100
и
меньше или равна 1000.
Рассмотрим несколько примеров применения оператора if.
Слайд 18Логические структуры командного интерпретатора
Следующий фрагмент программного кода выполняет поиск
слова в текстовом файле:
echo Enter the word and filename
read word file
if grep $word $file
then
echo $word found in $file
fi
Выполняющийся процесс ожидает ввода с консоли слова, которое следует искать, и имени файла, после чего анализирует содержимое файла. При обнаружении слова на экран выводится соответствующее сообщение.
Слайд 19Логические структуры командного интерпретатора
Логическая структура if имеет еще одну
форму, в которой используется оператор else:
if условие
then
команда_1
команда_2
else
команда_3
команда_4
fi
Слайд 20Логические структуры командного интерпретатора
Предыдущий пример можно модифицировать таким образом,
чтобы в нем использовался оператор if.. .else:
echo Enter the
word and filename
read word file
if grep $word $file >/dev/null
then
echo $word found in $file
else
echo $word is NOT found in $file
fi
Слайд 21Логические структуры командного интерпретатора
Выполняющийся процесс ожидает ввода с консоли
слова, которое следует искать, и имени файла, после чего анализирует
содержимое файла.
Если слово обнаружено, то выводится сообщение:
echo $word found in $file
иначе выводится другое сообщение:
echo $word is NOT found in $file
Слайд 22Логические структуры командного интерпретатора
В этом примере используется устройство:
/dev/null
Оно являющееся
приемником ненужной или нежелательной информации, которая может появляться в результате
выполнения команд.
Переназначение вывода в /dev/null применяется для "удаления мусора".
Слайд 23Логические структуры командного интерпретатора
Альтернативой оператору if в ряде случаев
может служить команда test, с которой мы уже сталкивались ранее.
Как и if, данная команда проверяет истинность определенных условий и полезна при организации ветвлений в программе.
Во многих случаях команда test применяется вместе с оператором if.
Команда test может принимать целый ряд опций:
• -r файл — условие истинно, если файл существует и доступен для чтения;
• -w файл — условие истинно, если файл существует и доступен для записи;
Слайд 24Логические структуры командного интерпретатора
• -х файл — условие истинно,
если файл существует и доступен для выполнения;
• -s файл
— условие истинно, если файл существует и его размер больше нуля;
• переменная_1 -eq переменная_2 — истинно, если переменная_1 равна значению переменная_2;
• переменная_1 -nе переменная_2 — истинно, если переменная_1 не равна значению переменная_2.
Слайд 25Логические структуры командного интерпретатора
Следующий фрагмент программного кода, в котором
используется как оператор if, так и команда test, отображает на
экране дисплея содержимое текстового файла, имя которого будет задано в командной строке:
if test -f $1
then
cat $1
fi
Слайд 26Логические структуры командного интерпретатора
Следующий тип логических структур, который мы
рассмотрим, операторы цикла while и until.
Оператор while можно представить
следующим образом:
while условие
do
команда_1
команда_2
…
команда_n
done
Слайд 27Логические структуры командного интерпретатора
Оператор while повторяет заданную группу команд,
если условие выполнения соответствует истине.
При этом условие проверяется перед
выполнением самой первой команды из списка.
Поэтому вполне возможно, что список не будет выполнен ни разу.
Слайд 28Логические структуры командного интерпретатора
Рассмотрим пример использования оператора while.
Предположим,
что необходимо записать символьные данные в файл с именем textfile.
Для окончания записи данных нужно нажать комбинацию клавиш +.
После этого содержимое файла будет отображено на дисплее.
Исходный текст командного файла показан далее:
Слайд 29Логические структуры командного интерпретатора
echo Please enter one or more
words and press Enter
echo Please end the list of
words by pressing Control-D
while read x
do
echo $x >> textfile
done
echo textfile contains the following words:
(содержит следующие слова)
cat textfile
Слайд 30Логические структуры командного интерпретатора
Что же касается оператора until, то
он представляет собой разновидность оператора while.
Основное отличие состоит в
том, что в while цикл выполняется, пока условие является истинным, в то время как в until повторение цикла осуществляется до тех пор, пока условие ложно.
Далее приводится пример использования оператора until.
Следующий фрагмент программного кода каждые 300 секунд проверяет присутствие на диске файла newtmp и, когда он создан, делает его архивную копию с именем newtmp.arch, удаляя оригинал:
Слайд 31Логические структуры командного интерпретатора
until test -r newtmp
do
sleep 300
echo Waiting until file is created...
done
echo File created. Making archive...
echo newtmp|cpio -ovB > newtmp.arch
rm newtmp
Слайд 32Логические структуры командного интерпретатора
Последний оператор, который мы рассмотрим и
который позволяет создавать программы с множественными ветвлениями.
Это оператор case.
Он
удобен для организации ветвления программы и работает по принципу совпадения шаблонов.
Вообще, оператор case можно заменить группой операторов if...else.
Однако во многих случаях использование case удобнее.
Оператор case имеет следующий формат:
Слайд 33Логические структуры командного интерпретатора
case переменная
in
шаблон_1)команда_11
команда_12
…
команда_1N;;
шаблон_2)команда_21
команда_22
…
команда_2N;;
шаблон_N)команда_N1
команда_N2
…
команда_NN;;
esac
Слайд 34Логические структуры командного интерпретатора
Здесь переменная сравнивается со всеми шаблонами,
причем первое же совпадение приводит к выполнению соответствующей группы команд
из списка.
Образец шаблон_N может включать обычные метасимволы командной оболочки shell.
Рассмотрим пример командного файла, исходный текст которого показан далее:
Слайд 35Логические структуры командного интерпретатора
echo Enter:
echo 1 - show
current directory
echo 2 - show content while read i
do
case $i in
l)
pwd
continue;;
2)
ls -l
continue;;
*)
break;;
esac
done
Слайд 36Логические структуры командного интерпретатора
Данный командный файл позволяет, в зависимости
от выбранной опции:
- либо просмотреть текущий каталог,
- либо содержимое этого каталога.
Здесь нам встретились две команды — break и continue.
Команда break выполняет безусловный выход из тела цикла.
А команда continue досрочно завершает текущую итерацию цикла while или for и переходит к следующей.
Слайд 37Список литературы:
Unix и Linux: руководство системного администратора, 4-е издание, 2012,
Э. Немет, Г. Снайдер, Т. Хейн, Б. Уэйли
Для начинающих работать
в UNIX, Ф.И. Торчинский.
Организация UNIX систем и ОС Solaris 9, Торчинский Ф.И., 2-е издание, исправленное, 2016.
Слайд 38Благодарю за внимание!
Преподаватель: Солодухин Андрей Геннадьевич
Электронная почта: asoloduhin@kait20.ru