Файл: Лабораторная работа 3. Командный интерпретатор shell.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 12.12.2023

Просмотров: 202

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Пусть командный файл "cmp" имеет вид:for i in "$*"doecho $idoneechofor i in "$@"doecho $idoneПри вызове: cmp aa bb ccна экран будет выведеноaa bb ccaabbcc5.5. Оператор цикла с истинным условием ("while")Структура "while", также обеспечивающая выполнение расчетов, предпочтительнее тогда, когда неизвестен заранее точный список значений параметров или этот список должен быть получен в результате вычислений в цикле.Оператор цикла "while" имеет структуру:while условиеdoсписок командdoneгде "while" - служебное слово определяющее тип цикла с истинным условием. Список команд в теле цикла (между "do" и "done") повторяется до тех пор, пока сохраняется истинность условия (т.е. код завершения последней команды в теле цикла равен "0") или цикл не будет прерван изнутри специальными командами ("break", "continue" или "exit"). При первом входе в цикл условие должно выполняться.#### print-50: Структура "while"# Расчет позволяет напечатать 50# экземпляров файла "file-22"n=0while [ $n -lt 50 ] # пока n < 50don=`expr $n + 1`cat file-22 > /dev/lpdoneОбратим внимание на то, что переменной "n" вначале присваивается значение 0, а не пустая строка, так как команда "expr" работает с shell-переменными как с целыми числами, а не как со строками.n=`expr $n + 1`т.е. при каждом выполнении значение "n" увеличивается на 1.Как и вообще в жизни, можно реализовать то же самое и сложнее. Расчет "рr-br" приведен для иллюстрации бесконечного цикла и использования команды "break", которая обеспечивает прекращение цикла.#### рr-br: Структура "while" c "break"# Расчет позволяет напечатать 50# экземпляров файла "file-22"n=0while truedoif [ $n -lt 50 ] # если n < 50then n=`expr $n + 1`else breakficat file-22 > /dev/lpdoneКоманда "break [n]" позволяет выходить из цикла. Если "n" отсутствует, то это эквивалентно "break 1". "n" указывает число вложенных циклов, из которых надо выйти, например, "break 3" - выход из трех вложенных циклов. В отличие от команды "break" команда "continue [n]" лишь прекращает выполнение текущего цикла и возвращает на НАЧАЛО цикла. Она также может быть с параметром. Например, "continue 2" означает выход на начало второго (если считать из глубины) вложенного цикла.Команда "exit [n]" позволяет выйти вообще из процедуры с кодом возврата "0" или "n" (если параметр "n" указан). Эта команда может использоваться не только в циклах. Даже в линейной последовательности команд она может быть полезна при отладке, чтобы прекратит выполнение (текущего) расчета в заданной точке.
5.6. Оператор цикла с ложным условием ("until")Оператор цикла "until" имеет структуру:until условиеdoсписок командdoneгде "until" - служебное слово определяющее тип цикла с ложным условием. Список команд в теле цикла (между "do" и "done") повторяется до тех пор, пока сохраняется ложность условия или цикл не будет прерван изнутри специальными командами ("break", "continue" или "exit"). При первом входе в цикл условие не должно выполняться.Отличие от оператора "while" состоит в том, что условие цикла проверяется на ложность (на ненулевой код завершения последней команды тела цикла) проверяется ПОСЛЕ каждого (в том числе и первого!) выполнения команд тела цикла.Примеры.until falsedoread xif [ $x = 5 ]then echo enough ; breakelse echo some morefidoneЗдесь программа с бесконечным циклом ждет ввода слов (повторяя на экране фразу "some more"), пока не будет введено "5". После этого выдается "enough" и команда "break" прекращает выполнение цикла.Другой пример ("Ожидание полдня") иллюстрирует возможность использовать в условии вычисления.until date | grep 12:00:dosleep 30doneЗдесь каждые 30 секунд выполняется командная строка условия. Команда "date" выдает текущую дату и время. Команда "grep" получает эту информацию через конвейер и пытается совместить заданный шаблон "12:00:" с временем, выдаваемым командой "date". При несовпадении "grep" выдает код возврата "1", что соответствует значению "ложь", и цикл "выполняет ожидание" в течение 30 секунд, после чего повторяется выполнение условия. В полдень (возможно с несколькими секундами) произойдет сравнение, условие станет истинным, "grep" выдаст на экран соответствующую строку и работа цикла закончится.5.7. Функции в shellФункция позволяет подготовить список команд shell для последующего выполнения.Описание функции имеет вид:имя(){список команд}после чего обращение к функции происходит по имени. При выполнении функции не создается нового процесса. Она выполняется в среде соответствующего процесса. Аргументы функции становятся ее позиционными параметрами; имя функции - ее нулевой параметр. Прервать выполнение функции можно оператором "return [n]", где (необязательное) "n" - код возврата.Пример. Вызов на выполнение файла "fun"echo $$fn() # описание функции{echo xx=$xxecho $#echo $0: $$ $1 $2xx=yy ; echo xx=$xxreturn 5}xx=xx ; echo xx=$xxfn a b # вызов функции "fn" с параметрамиecho $?echo xx=$xxсодержащего описание и вызов функции "fn", выдаст на экран:

749xx=xxxx=xx2fun: 749 a bxx=yy5xx=yy

Задание


  1. Выполнить приведённые примеры скриптов. Сравнить полученные результаты с ожидаемыми.

  2. Написать командные сценарии (скрипты). Запустить сценарии с различными параметрами, сравнить полученные результаты с ожидаемыми.
Задания.

  1. В качестве параметра скрипта указывается список имен файлов. разделенных пробелами. Для каждого из файлов: если файл существует, вывести данные о размере, владельце, правах доступа и т.п.; если не существует – выдать соответствующее сообщение.

  2. Написать сценарий, который в зависимости от первого параметра командной строки выдает:
а) общее количество зарегистрированных в системе пользователей;б) количество работающих в данный момент в системе пользователей;в) при запуске без параметров или с неверными параметрами – сообщение об ошибке.Примечание. Общим числом зарегистрированных пользователей считать число строк в файле /etc/passwd.

  1. Написать сценарий, определяющий, сколько сеансов указанного пользователя открыто в системе. Если указанный пользователь не присутствует в системе, выдать соответствующее сообщение. Имя пользователя передается в качестве параметра.

  2. В качестве параметра скрипта указывается имя файла. Если в файле не более 10 строк, вывести число символов в нем, иначе – число строк.

  3. В качестве параметра скрипта указывается имя файла и ключевое слово. Если ключевое слово присутствует в файле, вывести «Есть», иначе – «Нет».

  4. В качестве параметров скрипта указывается список пользователей (через пробел). Вывести информацию о сеансах тех из них, кто в данный момент работает в системе.

  5. Написать скрипт, который печатает количество указанных параметров командной строки. Если не указано ни одного параметра, вывести сообщение об ошибке.

  6. В качестве параметра скрипта указывается имя пользователя. Если пользователь с указанным именем существует, вывести информацию о том, работает ли он в данный момент в системе; иначе – вывести сообщение «Нет такого пользователя»
Примечание. Имена всех существующих (зарегистрированных) пользователей присутствуют в файле /etc/passwd.

  1. Если скрипт запущен без параметров, вывести список активных процессов на экран, иначе – в файл, имя которого указано как параметр.

  2. Определить, сколько сеансов провел в системе пользователь, имя которого указано в качестве параметра.

Примечание. Информацию о сеансах выдает команда last.

Содержание отчета:


  • цель работы;

  • результаты выполнения примеров скриптов;

  • номер задания;

  • текст командного сценария;

  • выводы.