Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС_ЛР 902_Часть2.doc
Скачиваний:
39
Добавлен:
15.04.2015
Размер:
274.94 Кб
Скачать

Командный интерпретатор shell

Продолжительность работы: 4 часа.

Цель работы: изучение основных команд и операторов командного интерпретатораSHELL, получение практических навыков составления сценариев в средеSHELL.

Краткие теоретические сведения

Почти любое используемое человеком изобретение обладает интерфейсом, посредствам которого осуществляется взаимодействие. Интерфейсом для Linux служит командный интерпретатор или оболочка (shell), являющаяся программным уровнем, который обеспечивает среду для ввода команд и параметров для получения желаемого результата.

Оболочка обеспечивает интерфейс между пользователем и основой Linux – ядром. Оболочка интерпретирует командные строки в качестве ввода, осуществляет подстановку имен файлов и переменных, переназначает ввод и вывод, отыскивает исполняемые файлы, инициирует и взаимодействует с программами.

То есть, во-первых: с помощью Shell запускаются все программы и команды, поэтому, можно сказать, что она устанавливает рамки в которых работает операционная система. Этому посвящена первая часть лабораторной работы.

Во-вторых, оболочка является мощным языком программирования. Оболочка создает дочерние процессы и может управлять их выполнением. Она поддерживает переменные среды каждого пользователя.

Существует несколько «оболочек» shell. Разница между ними не очень значительна. В данной лабораторной работе мы будем рассматривать оболочку Bash (Bourne Again Shell).

  1. Запуск и выход из оболочки

Программа Bourne Again Shellзапускается командойbash. ПодLinuxвы можете запуститьBourne Again Shellи при помощи командыsh. Как правило, когда вы входите в систему, указывая свой пароль, автоматически запускаетсяshell. Этот интерпретатор имеет специальное назначение и называетсяLogin shell. Однако это та же самая программа.

Большинство программ закрываются путем ввода специальных команд exit,byeилиquit. Редко встречаются варианты, в которых действуют все три команды, однако почти всегда хотя бы одна из них годится для выхода из программы. ПрограммаBourne Shellпринимает командыexitиbye. Кроме того, довольно часто из программыshellможно выйти, введя символ конца файла при помощи комбинации клавишCtrl+D. ИнтерпретаторLogin Shellможно закрыть также командойlogout.

  1. Интерпретация командной строки

При входе в систему запускается специальная версия оболочки, называемая интерактивной оболочкой, отображается приглашение, обычно в форме знака доллара ($), процента (%) или фунта (#). При вводе строки в ответ на это приглашение оболочка пытается интерпретировать ее. Ввод в ответ на приглашение оболочки иногда называют командной строкой. Основной формат командной строки выглядит следующим образом: имя команды опции аргументы

Имя Команды - это исполняемая команда Linux, программа, утилита или программа оболочки.

Опции начинаются с тире и влияют на исполнение всей команды.

Аргументы передаются исполняемому модулю (например, имена файлов).

    1. Последовательное выполнение команд (символ ;)

В одной командной строке вы можете указать несколько команд. Эти команды должны быть разделены символом ; (точка с запятой) или символом&(амперсанд):command1; command2; command3<enter>

Система Linuxвыполняет команды в том порядке, в котором они стоят в командной строке, и печатает вывод этих команд в том же порядке. Этот процесс называется последовательным выполнением.

Например, введите:

cd; pwd; ls<enter>

Shellвыполнит эти команды последовательно:

  • cdизменит ваше местоположение, переместив вас в регистрационный каталог;

  • pwdраспечатает полное имя пути вашего текущего каталога;

  • lsперечислит файлы в вашем текущем каталоге.

  1. Специальные символы

Shellимеет также и другие символы, которые выполняют различные полезные функции.

    1. Поиск всех символов (метасимвол *)

Метасимвол *заменяет любое число символов (в том числе и ноль символов)

    1. Поиск по одному символу (метасимвол ?)

Метасимвол ?заменяет любой символ.

    1. Отмена специального значения (метасимвол \)

Символ \позволяет вам отменить специальное значение следующего за ним символа. Например, у вас есть файлtrail, который содержит следующий текст:

The all * game

Чтобы найти символ звездочка (*) в файле, употребите командуgrep:

grep \* trail<enter>

Команда grepнайдет символ*в тексте и отобразит строку, в которой она появилась. Без символа\, символ звездочка будет интерпретироватьсяshellкак метасимвол.

    1. Использование кавычек для отмены значения символа пробел

Кавычки, как и обратная косая черта, часто используются для отмены специального значения пробела. Shellинтерпретирует пробел в командной строке как разделитель между аргументами команды. Одиночные и двойные кавычки и обратная косая черта позволяют отменить это значение. Например, чтобы в тексте разместить два или более слова, сделайте эти два слова одним аргументом, заключив их в кавычки.

  1. Создание простых программ shell и их выполнение

С помощью текстового редактора создайте файл dl и введите в него строки:

pwd<ENTER>

ls<ENTER>

echo This is the end of the shell program.<ENTER>

Теперь вы имеете программу shell. Вы можете отобразить это содержимое файла с помощьюcat:

cat dl<ENTER>

Выполнить shell программу вы можете с помощью командыsh. Введите:

sh dl<ENTER>

С помощью команды chmodвы можете сделать файл исполняемым:

chmod u+x dl<ENTER>

Обратите внимание, что chmodвключает разрешение на выполнение (+x) для пользователя (u). Теперьdlявляется исполняемой программой. Попытайтесь выполнить ее. Введите:dl<ENTER>

При выполнении данного примера вызвать dl не удастся. Дело в том, что в пути поиска не указан текущий каталог. Исправить положение можно двумя способами: дополнить PATH (переменная, определяющая имя пути, используемое shell для нахождения команд) символом, или вызвать указанную команду с указанием полного пути доступа:

PATH=”PATH: .”; dl вариант 1

./dl вариант 2

    1. Ограничения при именовании программ shell

Shell программе вы можете дать любое имя, не совпадающее с именами системных команд. Если имя вашей программы совпадает с именем команды системы, то система будет выполнять вашу команду вместо системной.

    1. Переменные

Shellпрограммы манипулируют с переменными. Такими как:

  • позиционные параметры;

  • специальные параметры;

  • именованные переменные.

      1. Позиционные параметры

Позиционные параметры являются переменными в shellпрограмме. Их значение устанавливается из аргументов, указанных в командной строке, которая вызывает программу. Позиционные параметры нумеруются, и на них идет ссылка символами$: $1,$2,$3и т.д.Shellпрограмма может использовать до 9 позиционных параметров. Еслиshellпрограмма вызывается с помощью командной строки наподобие:

shell.prog pp1 pp2 pp3 pp4 pp5 pp6 pp7 pp8 pp9 <ENTER>

то позиционному параметру $1в программе присваивается значениеpp1,$2- значениеpp2и т.д. во время вызова программы. Чтобы практически рассмотреть это замещение позиционных параметров сделайте следующее. Командаwhoперечисляет всех пользователей, в данный момент зарегистрированных в системе. Можем создать простую программуwhoson, которая будет сообщать, работает ли в настоящий момент конкретный пользователь. Введем в файлwhosonкомандную строку:who | grep $1<ENTER>

Команда whoперечисляет всех текущих пользователей системы, а командаgrepосуществляет поиск строки, содержащей значение, соответствующее позиционному параметру$1. Теперь подставим конкретное имя в качестве аргумента в файлеwhoson, например,user1.

Если указанный пользователь user1не зарегистрирован в данный момент в системе,grepзавершится неудачно иwhosonне будет ничего выводить на экран.

      1. Специальные параметры

Наиболее важный из них : $?

Большинство команд shellвозвращает коды, которые указывают, успешно ли завершилась команда. Если возвращаемое значение 0 (ноль), то команда выполнилась успешно. Коды возврата не печатаются автоматически, но их можно получить как значение этого параметра.

      1. Именованные переменные

Переменная – это область данных, обладающая именем и содержимым. Имя может состоять только из букв и цифр и не может начинаться с цифры. Содержимое – любой текст. Значение именованной переменной вы присваиваете сами следующим образом:

name_variable=value<ENTER>

Обратите внимание, что ни слева, ни справа от знака равенства нет пробелов.

В следующем примере var1- это имя переменной, аmyname- значение строки символов, которое присваивается переменной:

Пример

var1=myname<ENTER>

Знак $используется перед именем переменной вshellпрограмме для ссылки на значение этой переменной. Если взять предыдущий пример, то ссылка$var1говоритshell, что нужно заменить любую встретившуюся строку символов$var1на значениеmyname.

Переменные могут хранить целые команды:

ls2=’lsl

$ ls2

Значение этих переменных вы можете определить двумя способами. Первый, вы можете ввести: echo $variable_name

Система распечатает значение переменной variable_name. Второй способ: вы можете воспользоваться командойenvдля распечатки значений всех определенных переменных вshell. Для этого введите командуenvи система выдаст список всех имен переменных и их значения.

    1. Удаление переменных

Переменные сохраняются недолго. По завершении shell они теряются, поэтому уничтожать их вручную, как правило, не требуется. Если же возникла такая необходимость, используйте команду unset. Синтаксис: unset [имя _ переменной…]

    1. Присвоение значений переменным

Существует еще несколько способов присвоения значения переменной:

  • использование команды readдля присвоения ввода переменной;

  • перенаправление вывода команды в переменную;

  • присвоение позиционного параметра переменной.

    1. Использование команды read

Общий формат команды read:

read variable<ENTER>

Значение, присвоенное командой readпеременнойvariable, будет заменять$variableгде бы она не встречалась в программе пользователя.

Команда readбудет ждать до тех пор, пока вы не введете строку символов и нажмете клавишу<ENTER>, тем самым присваивая строку переменной.

Следующий пример покажет вам, как написать простую shellпрограммуnum.please, содержащую имена. Программа будет выглядеть следующим образом:

cat num.please<ENTER>

echo Введите имя:

read name

grep $name home/list

Создайте файл list, содержащий несколько фамилий и номеров телефонов. И теперь запустите файлnum.please. В следующем примере приводится текст программыmknum, которая создает список номеров телефонов и абонентов.

Если вы хотите, чтобы вывод команды echoдобавлялся в конец списка, то вы должны использовать>>. Если вы будете использовать>, то список будет состоять из последнего номера телефона, который вы добавили.

С помощью команды cat:

cat mknum<ENTER>

отобразите содержание программы mknum:

echo Введите имя

read name

echo Введите номер

read num

echo $name $num >> list

Сделайте mknum выполняемой программой:

chmod u+x mknum<ENTER>

    1. Арифметические операции: команда let

Команда let - это команда интерпретатораBASH shell, обеспечивающая выполнение операций над арифметическими величинами. С помощью этой команды можно сравнивать числовые значения или выполнять над ними арифметические операции, такие как сложение или умножение. Команда letзадается либо с помощью ключевого словаlet, либо посредством двойных круглых скобок. Базовый формат команды включает ключевое словоlet, за которым следуют два числовых значения, разделенных арифметическим оператором либо оператором сравнения:

$ let значение1 оператор значение2

Следующий пример наглядно демонстрирует, как изменяется работа интерпретатора при использовании ключевого слова let.

$ T=2+3

$ echo $T

2+3

$ let T=2+3

$ echo $T

5

В shell-сценариях может использоваться любой из перечисленных в таблице 1 операторов.

Ключевое слово let можно использовать и без оператора присваивания.

$ let 2*7

14

Если в арифметическом выражении между операндами необходимо поместить пробелы, выражение следует заключить в кавычки. Аргументом команды let может быть только одно арифметическое выражение, например:$ let "2*7"

Таблица 1

Арифметические операторы

Функции

*

Умножение

/

Деление

+

Сложение

-

Вычитание

Логические операторы

Функции

>

Больше чем

<

Меньше чем

>=

Больше либо равно

<=

Меньше либо равно

=

Равенство в выражениях

!=

Не равно

  1. Конструкции языка программирования Shell

Язык программирования shellимеет несколько конструкций, которые придадут гибкость вашим программам:

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

  • команда exitпозволяет завершать программу в нужной точке и использовать коды возврата;

  • конструкции цикла for,whileпозволяют повторять группу команд в цикле;

  • условные команды ifиcaseвыполняют группу команд, если выполнилось некоторое условие;

  • команда breakпозволяет выполнить безусловный выход из цикла.

    1. Комментарии

Чтобы в программе разместить комментарии, воспользуйтесь знаком #. Если знак#стоит после команды, то сама команда выполняется, а комментарий игнорируется. Формат строки комментария:

#comment<ENTER>

    1. Циклы

Операторы цикла forиwhileпозволяют выполнить команду или последовательность команд несколько раз.

    1. Оператор for

Оператор forвыполняет последовательность команд для каждого элемента списка. Он имеет формат:

for переменная<ENTER>

inзначения переменной<ENTER>

do<ENTER>

команда_1<ENTER>

последняя команда<ENTER>

done<ENTER>

Для каждой итерации цикла следующий элемент списка присваивается переменной, данной в операторе for. Ссылка на эту переменную может быть сделана в любом месте в командах внутри оператораdo. При конструировании каждой секции команд вам необходимо убедиться, что каждомуdoсоответствуетdoneв конце цикла. Переменная может иметь любое имя. Например, если ваша переменная названаvar, то ссылка в списке команд на$varсделает значение доступным. Если операторinопущен, то значением дляvarбудет набор аргументов, заданный в команде и доступный в специальном параметре$*. Список команд между ключевым словомdoиdoneбудет выполнен для каждого значения.

Когда команды будут выполнены для последнего элемента списка, программа будет выполнять строку ниже done.

    1. Оператор while

Оператор цикла whileиспользует 2 группы команд. Он будет выполнять последовательность команд во второй группе (списокdo...done) до тех пор, пока последняя команда в первой группе (списокwhile) возвращает состояние "истина", означающее, что выражение послеdoможет быть выполнено.

Общий формат оператора цикла while:

while<ENTER>

команда_1<ENTER>

последняя команда<ENTER>

do<ENTER>

команда _1<ENTER>

последняя команда<ENTER>

done<ENTER>

Например, программа enter.nameиспользует циклwhileдля ввода списка имен в файл. Программа состоит из следующих командных строк:

echo“Введите пожалуйста список имён<ENTER>

echo“после завершения ввода нажмите<Ctrl+D>

while read x

do

echo $x>>xfile

done

echoxfileсодержит следующие имена:

cat xfile

Их можно просмотреть, введя команду:

cat enter.name<ENTER>

Обратите внимание, что после завершения цикла программа выполняет команды ниже done.

После того, как цикл завершится, программа распечатает все имена, содержащиеся в xfile.

    1. Условные операторы. Оператор if ... then

Команда ifговоритshellпрограмме, что нужно выполнить последовательность команд послеthen, если последняя команда в списке команд конструкцииifвыполнилась успешно. Конструкцииifзаканчиваются ключевым словомfi.

      1. Общий формат конструкции if

if<ENTER>

команда _1<ENTER>

последняя команда<ENTER>

then<ENTER>

команда _1<ENTER>

последняя команда<ENTER>

fi<ENTER>

Например, shellпрограммаsearchдемонстрирует применение конструкцииif... then. Программаsearchиспользует командуgrepдля поиска слова в файле. Еслиgrepвыполнилась успешно, то программа отображает найденное слово. После ввода:

cat search<ENTER>

экран будет выглядеть следующим образом:

echo Введите искомое слово и имя файла, в котором будем искать

read word

read file

if grep $word $file

then echo $word is in $file

fi

Эта программа отображает вывод команды grep. Если вы хотите сохранить ответ системы на команду grep в вашей программе, то воспользуйтесь файлом /dev/null, изменив командную строку if на следующую:

if grep $word $file > /dev/null<ENTER>

Теперь выполните команду search. Она ответит только сообщением, указанным после командыecho.

Конструкция if ... then ... elseможет исполнять альтернативный набор команд, стоящий послеelse, в случае, если последовательностьifявляется ложью. Формат этой конструкции следующий:

if<ENTER>

команда_1<ENTER>

последняя команда<ENTER>

then<ENTER>

команда _1<ENTER>

последняя команда<ENTER>

else<ENTER>

команда _1<ENTER>

последняя команда<ENTER>

fi<ENTER>

С помощью этой конструкции вы можете усовершенствовать программу search, так что она будет сообщать вам и найденное слово и то, что слово не найдено. В этом случае программаsearchбудет выглядеть следующим образом:

echo Введите искомое слово и имя файла, в котором будем искать

read word

read file

if

grep $word $file > /dev/null

then

echo $word is in $file

else

echo $word is NOT in $file

fi

Для команд существуют логические операции:

Логическое и: команда &&команда

Логическое или: команда ||команда

Логическое не: !команда

    1. Безусловная передача управления

Команда breakбезусловно останавливает выполнение любого цикла, в котором он встречается и передает управление команде, следующей после ключевых словdone илиfi.

Команда continueприведет к тому, что программа немедленно перейдет к следующей итерации циклаwhileилиforбез выполнения остальных команд в цикле.

  1. Отладка программы

Для нахождения и корректировки ошибок вам могут понадобиться две опции команды sh:

sh -v shellprogramname

(печатает вводимые shellстроки, как если бы они были прочитаны системой);

sh -x shellprogramname

(печатает команды и их аргументы по мере их выполнения).

Контрольные вопросы

  1. Перечислите основные функции командного интерпретатора Shell.

  2. Как осуществляется вход и выход из оболочки?

  3. Расскажите о метасимволах используемых в Shellи опишите их основные функции.

  4. Опишите механизм создания и запуска программ в Shell.

  5. Расскажите о позиционных и специальных параметрах.

  6. Расскажите об именованных параметрах, опишите механизм их создания.

  7. Как удалить именованные переменные?

  8. Как изменить значение зарезервированным переменным?

  9. Опишите известные вам способы присвоения значений переменным.

  10. Расскажите о том, как можно производить вычисления в Shell.

  11. Расскажите об известных вам конструкциях языка программирования Shell.

  12. Опишите механизм отладки программ в Shell.

Практическая часть

  1. Войдите в командный интерпретатор (если он не запустился автоматически).

  2. Создайте несколько локальных и глобальных переменных. Используя переменные a,b,c,d,x, создайте сценарий записи в файл результатов вычисления заданных выражений:

, a=[1,2,5,8,10]

Для написания вам понадобятся операторы read, echo,forиlet; сделайте ваш программный файл исполняемым.

  1. Напишите программу, которая будет помещать в заданный текстовый файл, вводимые вами имена студентов вашей группы и оценки по дисциплине «Операционные системы». Вам понадобятся операторы read, echoиwhile.

  2. Измените программу из предыдущего задания таким образом, чтобы файл со списком студентов не содержал повторяющихся записей и при вводе повторяющейся информации на экран выводились соответствующие сообщения. Вам понадобится операторы if, else, break или continue. Рекомендуется очистить содержимое файла, если в нём уже есть повторения.

  3. Удалите переменные, созданные вами в начале работы.

Примечание

Вы можете проверить правильность выполнения ваших заданий с помощью специальной контролирующей программы:

Формат: <путь> labcontrol name1 name2 num

где name1– имя проверяемой программы;

name2 – имя файла результатов проверяемой программы;

num– номер задания;

<путь> – путь к файлу с контролирующей программой.

Пример

$./ labcontrol prog res 2– вызов контролирующей программы, если она находится в текущей директории для проверяемой программыprogс файлом результатаresдля задания №2 ($- приглашение системы).

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

Задание 2

Входные данные: значения переменных b,c,dвводятся с клавиатуры отдельными операторамиread.

Выходные данные: результаты вычислений выводятся в файл результатов отдельными операторами echo.

Задание 4

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

Выходные данные: таблица оценок студентов выводятся в файл результатов отдельными операторами echo по образцу. Образец вывода:

Иванов – 5

Петров – 3

Сидоров – 2

Внимание!В программах не должно быть операторов ввода и вывода, вводящих или выводящих какую либо вспомогательную информацию, а при выводе в файл - лишних пробелов или других символов.

Приложение 1. Руководство пользователя

Для использования контролирующей программы нужно:

  1. Набрать с помощью текстового редактора или скопировать файл с именем labcontrol (без расширения) с программой (см. Приложение 2). Его можно поместить в рабочий каталог на каждом компьютере или на сервер, но в последнем случае следует уточнить путь вызова программы.

  2. Установить права доступа к файлу с программой как к исполняемому командой chmod 111 labcontrol.

  3. Создать или скопировать в каталог с программой файлы с примерами и эталонные файлы результатов для всех проверяемых заданий. Для проверки данной лабораторной работы (а именно заданий 2 и 4) должны быть созданы следующие файлы:

Для задания 2

Файл 2_exp(без расширения):

3

1

2

Файл 2_pat(без расширения):

250

1

Для задания 4

Файл 4_exp(без расширения):

Иванов

4

Петров

3

Кулебякин

5

Иванов

2

Файл 4_pat(без расширения):

Иванов – 4

Петров – 3

Кулебякин – 5

  1. Запретить доступ по записи к этим файлам, введя команды chmod 444 2_exp; chmod 444 2_pat; chmod 444 4_epx; chmod 444 4_pat.

Примечание

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

Приложение 2. Контролирующая программа

if ! test –f $3_exp

then echo Отсутствует файл с примером.; exit

#Проверка существования файла с исходными данными

fi

if ! test –f $3_pat

then echo Отсутствует файл с образцом.; exit

#Проверка существования файла с контрольными результатами

fi

if ! test –f $1

then echo Отсутствует файл с программой $1.; exit

#Проверка существования файла со сценарием, написанным студентом

fi

if ! test –r $1

then echo Ошибка: нет доступа по чтению к файлу с программой $1.; exit

#Проверка правильности установки доступа к файлу с программой

fi

mv $2 temp.txt 2>/dev/null

#Сохранение исходного файла с результатами работы программы студента под другим именем с перенаправлением стандартного вывода ошибок

if ! test –x $1

then echo Ошибка: файл с программой $1 не является исполняемым.

#Проверка правильности установки доступа к файлу с программой

fi

sh $1 <$3_exp >/dev/null 2>/dev/null

#Выполнение проверяемой программы с перенаправлением на её вход файла с исходными данными (не выводя сообщения этой программы)

if ! test –f $2

then echo Файл результата $2 не найден.; mv temp.txt $2 2>/dev/null; exit

#Проверка существования файла с результатами

fi

if diff $2 $3_pat –q >/dev/null 2>/dev/null

#проверка идентичности результата выполнения программы и контрольного варианта

then echo Результат выполнения программы верен!

else echo Ошибка: неверный результат выполнения программы!

fi

mv temp.txt $2 2>/dev/null

#восстановление под прежним именем ранее созданного файла с результатом работы программы

Приложение 3. Указания к использованию контролирующей программы

Данная программа (labcontrol) написана наBASHкак исполняемый файл. Формат: <путь>labcontrol name1 name2 num

где name1– имя проверяемой программы;

name2 – имя файла результатов проверяемой программы;

num – номер задания;

<путь> – путь к файлу с контролирующей программой.

Пример

$./ labcontrol prog res2– вызов контролирующей программы, если она находится в текущей директории для проверяемой программыprogс файлом результатаresдля задания №2.

Для работы программы необходимы файлы с именами <номер задания>_exp(файл входных данных) и <номер задания>_pat(образцовый файл результатов).

Перед началом контроля программа осуществляет проверку существования двух вышеуказанных файлов, файла с проверяемой программой и файла результатов (проверка на его наличие осуществляется после выполнения проверяемой программы) и выдаёт сообщение, если они не найдены. В программе «заглушены» все выводы стандартных процедур и после её выполнения выдаются лишь результаты проверки на наличие требуемых файлов и результаты контроля.

Результатом работы программы являются:

  • сообщения об отсутствии необходимых файлов (если они не найдены);

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

  • результат проверки на наличие доступа по чтению к проверяемой программе;

  • результат сверки файла результатов проверяемой программы с эталонным файлом результатов.

Программа не производит проверки содержания и правильности работы проверяемой программы, а только сверяет файл результатов с эталонным для заданного примера, поэтому в задании должны быть строго оговорены требования к входным и выходным данным проверяемой программы.

Л А Б О Р А Т О Р Н А Я Р А Б О Т А № 7