Файл: Лабораторная работа 3. Командный интерпретатор shell.docx
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 12.12.2023
Просмотров: 65
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Пусть командный файл "cmp" имеет вид:
for i in "$*"
do
echo $i
done
echo
for i in "$@"
do
echo $i
done
При вызове: cmp aa bb cc
на экран будет выведено
aa bb cc
aa
bb
cc
5.5. Оператор цикла с истинным условием ("while")
Структура "while", также обеспечивающая выполнение расчетов, предпочтительнее тогда, когда неизвестен заранее точный список значений параметров или этот список должен быть получен в результате вычислений в цикле.
Оператор цикла "while" имеет структуру:
while условие
do
список команд
done
где "while" - служебное слово определяющее тип цикла с истинным условием. Список команд в теле цикла (между "do" и "done") повторяется до тех пор, пока сохраняется истинность условия (т.е. код завершения последней команды в теле цикла равен "0") или цикл не будет прерван изнутри специальными командами ("break", "continue" или "exit"). При первом входе в цикл условие должно выполняться.
###
# print-50: Структура "while"
# Расчет позволяет напечатать 50
# экземпляров файла "file-22"
n=0
while [ $n -lt 50 ] # пока n < 50
do
n=`expr $n + 1`
cat file-22 > /dev/lp
done
Обратим внимание на то, что переменной "n" вначале присваивается значение 0, а не пустая строка, так как команда "expr" работает с shell-переменными как с целыми числами, а не как со строками.
n=`expr $n + 1`
т.е. при каждом выполнении значение "n" увеличивается на 1.
Как и вообще в жизни, можно реализовать то же самое и сложнее. Расчет "рr-br" приведен для иллюстрации бесконечного цикла и использования команды "break", которая обеспечивает прекращение цикла.
###
# рr-br: Структура "while" c "break"
# Расчет позволяет напечатать 50
# экземпляров файла "file-22"
n=0
while true
do
if [ $n -lt 50 ] # если n < 50
then n=`expr $n + 1`
else break
fi
cat file-22 > /dev/lp
done
Команда "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 false
do
read x
if [ $x = 5 ]
then echo enough ; break
else echo some more
fi
done
Здесь программа с бесконечным циклом ждет ввода слов (повторяя на экране фразу "some more"), пока не будет введено "5". После этого выдается "enough" и команда "break" прекращает выполнение цикла.
Другой пример ("Ожидание полдня") иллюстрирует возможность использовать в условии вычисления.
until date | grep 12:00:
do
sleep 30
done
Здесь каждые 30 секунд выполняется командная строка условия. Команда "date" выдает текущую дату и время. Команда "grep" получает эту информацию через конвейер и пытается совместить заданный шаблон "12:00:" с временем, выдаваемым командой "date". При несовпадении "grep" выдает код возврата "1", что соответствует значению "ложь", и цикл "выполняет ожидание" в течение 30 секунд, после чего повторяется выполнение условия. В полдень (возможно с несколькими секундами) произойдет сравнение, условие станет истинным, "grep" выдаст на экран соответствующую строку и работа цикла закончится.
5.7. Функции в shell
Функция позволяет подготовить список команд shell для последующего выполнения.
Описание функции имеет вид:
имя()
{
список команд
}
после чего обращение к функции происходит по имени. При выполнении функции не создается нового процесса. Она выполняется в среде соответствующего процесса. Аргументы функции становятся ее позиционными параметрами; имя функции - ее нулевой параметр. Прервать выполнение функции можно оператором "return [n]", где (необязательное) "n" - код возврата.
Пример. Вызов на выполнение файла "fun"
echo $$
fn() # описание функции
{
echo xx=$xx
echo $#
echo $0: $$ $1 $2
xx=yy ; echo xx=$xx
return 5
}
xx=xx ; echo xx=$xx
fn a b # вызов функции "fn" с параметрами
echo $?
echo xx=$xx
содержащего описание и вызов функции "fn", выдаст на экран:
749
xx=xx
xx=xx
2
fun: 749 a b
xx=yy
5
xx=yy
Задание
-
Выполнить приведённые примеры скриптов. Сравнить полученные результаты с ожидаемыми. -
Написать командные сценарии (скрипты). Запустить сценарии с различными параметрами, сравнить полученные результаты с ожидаемыми.
Задания.
-
В качестве параметра скрипта указывается список имен файлов. разделенных пробелами. Для каждого из файлов: если файл существует, вывести данные о размере, владельце, правах доступа и т.п.; если не существует – выдать соответствующее сообщение. -
Написать сценарий, который в зависимости от первого параметра командной строки выдает:
а) общее количество зарегистрированных в системе пользователей;
б) количество работающих в данный момент в системе пользователей;
в) при запуске без параметров или с неверными параметрами – сообщение об ошибке.
Примечание. Общим числом зарегистрированных пользователей считать число строк в файле /etc/passwd.
-
Написать сценарий, определяющий, сколько сеансов указанного пользователя открыто в системе. Если указанный пользователь не присутствует в системе, выдать соответствующее сообщение. Имя пользователя передается в качестве параметра. -
В качестве параметра скрипта указывается имя файла. Если в файле не более 10 строк, вывести число символов в нем, иначе – число строк. -
В качестве параметра скрипта указывается имя файла и ключевое слово. Если ключевое слово присутствует в файле, вывести «Есть», иначе – «Нет». -
В качестве параметров скрипта указывается список пользователей (через пробел). Вывести информацию о сеансах тех из них, кто в данный момент работает в системе. -
Написать скрипт, который печатает количество указанных параметров командной строки. Если не указано ни одного параметра, вывести сообщение об ошибке. -
В качестве параметра скрипта указывается имя пользователя. Если пользователь с указанным именем существует, вывести информацию о том, работает ли он в данный момент в системе; иначе – вывести сообщение «Нет такого пользователя»
Примечание. Имена всех существующих (зарегистрированных) пользователей присутствуют в файле /etc/passwd.
-
Если скрипт запущен без параметров, вывести список активных процессов на экран, иначе – в файл, имя которого указано как параметр. -
Определить, сколько сеансов провел в системе пользователь, имя которого указано в качестве параметра.
Примечание. Информацию о сеансах выдает команда last.
Содержание отчета:
-
цель работы; -
результаты выполнения примеров скриптов; -
номер задания; -
текст командного сценария; -
выводы.