Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Часть 1. Программирование на языке командной оболочки shell script




Лабораторная работа № 1

Основы программирования на языках командных интерпретаторов

Цель работы: ознакомление с основными возможностями языков программирования командных интерпретаторов POSIX-совместимых операционных систем.

 

Указания по порядку выполнения работы

Лабораторная работа состоит из двух частей. Первая часть посвящена ознакомлению с функциональными возможностями языка shell script.Вовторой части рассматриваются основы программирования в командной оболочке Windows PowerShell2.0.

Описание первой части работы не содержит явно выделенной практической составляющей. Для выполнения работы необходимо:

1) ознакомиться с содержанием описания;

2) выполнить все приводимые в описании примеры и задания, используя реальную или виртуальную операционную среду;

3) зафиксировать в отчете тексты примеров и заданий, а также результаты их выполнения.

4) при защите работы необходимо пояснить полученные результаты.

Для выполнения второй части работы необходимо:

1) ознакомиться с содержанием теоретической части;

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

3) выполнить задания практической части;

4) составить отчет.

 

Часть 1. Программирование на языке командной оболочки shell script

 

Командная оболочка во всех unix-подобных системах является мощным инструментом администратора операционной системы. Для полноценного выполнения функций администрирования необходимо знать язык командной оболочки и уметь программировать на нем.

Почти во всех дистрибутивах Unix и Linux для пользователей по умолчанию предлагается командная оболочка bash (Bourne Again SHell), которая фактически стала неофициальным стандартом для unix-подобных систем[1].

Командную оболочку можно рассматривать как язык программирования (его называют shell или shell script) и как программную среду выполнения одновременно. Этот язык не компилируемый, а интерпретируемый и он разрабатывался как вспомогательный инструмент администратора.

Это объясняется тем, что в Unix и подобных системах существует большой набор утилит, каждая из которых выполняет свою задачу. При помощи конвейерной обработки команд эти утилиты можно объединять для выполнения более сложных задач. Однако не все задачи можно решить с помощью конвейеров, иногда требуется реализация более сложных алгоритмов администрирования и, следовательно, составление программ на языке shell.

Файл с программой на shell script — это набор команд, которые пользователь может вводить в командной строке. Если его запустить на выполнение, будут выполнены все команды, описанные в этом файле. Но кроме простого выполнения команд в shell имеются дополнительные возможности, присущие многим языкам программирования.

В данной лабораторной работе будут изучаться основы языка командной оболочки bash.

Для запуска интерпретатора bashв начале командного файла (или в первой строке окна терминала) следует ввести команду

#! /bin/bash

В этой команде указывается путь к интерпретатору, начинающийся с символов #!

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

. programЗдесь program – имя командного файла (после символа «.» пробел обязателен!).

В shell script, как и в любом языке программирования существуют переменные. Они имеют несколько особенностей.

  1. Все переменные не типизированы и их значения считаются строками. Если переменная будет использоваться в математическом выражении, то будет происходить проверка типа переменной.
  2. Отсутствует понятие "области видимости" переменных. Переменные доступны в любом месте кода, в том числе и в функциях. Ели переменная будет определена в функции, она все равно будет глобальной, и к ней можно обращаться из любого места программы.
  3. Если обратиться к неопределенной переменной, интерпретатор не будет выдавать сообщение об ошибке.

Для определения переменной необходимо написать имя переменной (большие и маленькие буквы различаются), затем символ "равно" и значение переменной. Если в значении переменной встречаются пробелы, то его необходимо поместить в двойные или одинарные кавычки.

Для получения значения переменной перед её именем следует указывать знак $.

В shell script особое значение имеют одинарные кавычки — все специальные символы, находящиеся внутри таких кавычек экранируются. Например, в команде

echo '$CAR: '

символ $ не будет интерпретироваться как специальный символ и в результате на экран будет выведено

$CAR:

(оператор еcho выводит на экран строку или переменную, идущую после него).

 

Пример 1

Подготовить и выполнить в командной оболочке следующую программу:

#!/bin/bash CAR="porshe the best" echo "CAR:" echo CAR echo '$CAR: ' echo $CAR

Примечание. Рекомендуется следующая последовательность выполнения примеров:

  1. Запустить виртуальную операционную систему (ОС).
  2. Определить рабочий каталог, в котором будут создаваться командные файлы примеров.
  3. Открыть рабочий каталог, в нем создать файл нового документа и присвоить ему имя, связанное с выполняемым примером, например, Primer1.
  4. Открыть новый файл в текстовом редакторе, ввести программу примера и сохранить ее в данном каталоге.
5. Открыть каталог в окне терминала и в командной строке ввести имя командного файла по форме . program
  1. Для запуска файла на выполнение нажать <Enter>.

 

В shell script можно использовать массивы переменных. Существует несколько способов определения массивов.

В одном из них определение элементов происходит путем указания имени массива. Затем в квадратных скобках указывается номер элемента в массиве и дальше ему присваивается значение как обычной переменной, например

CAR[0]=porsh #CAR[1]=bmw #CAR[2]=mers #CAR[3]=volga#CAR[10]=LADA

Элементы массива в этом случае могут задаваться не по порядку. Если обратиться к несуществующему элементу массива, интерпретатор не будет выдавать ошибку.

В другом способе определения массива сначала пишется имя массива, а затем внутри круглых скобок элементам массива присваиваются значения:

CAR=([0]=porsh [1]=bmw [2]=mers [5]=volga [10]=LADA)

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

CAR=(porsh bmw mers volga LADA)

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

${CAR[0]} – получение нулевого элемента.

Обратите внимание на фигурные скобки. В случае массивов их использование обязательно.

Для вывода всего содержимого массива после имени массива в квадратных скобках нужно указать либо символ @, либо *:

${CAR[*]} ${CAR[@]} Пример 2

Подготовить и выполнить следующую программу:

#!/bin/bash echo "Massiv" CAR=(porsh bmw mers volga LADA) echo "*********************************"echo "CAR[0]=${CAR[0]}" echo "CAR[1]=${CAR[1]}" echo "CAR[2]=${CAR[2]}" echo "CAR[3]=${CAR[3]}" echo "CAR[4]=${CAR[4]}" echo "*********************************"echo "ALL — ${CAR[*]}" echo "UHO — ${CAR[@]}" echo "*********************************"

 

Примечание. В shell имеется большое количество встроенных переменных. Описание всех переменных можно найти в справочном руководстве интерпретатора.

 

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

read переменная1 переменная2 ...

При выполнении оператора read, на экране терминала появится курсор и пользователю даётся возможность ввести данные, разделяемые пробелом. Ввод завершается нажатием на клавишу <Enter>. Если оператор read вызывать без указания переменной, он все данные, введенные пользователем, поместит в переменную по умолчанию — REPLAY.

Обычно перед применением оператора read на экран выдается запрос о вводимых переменных. Делается это при помощи команды echo. Если для этой команды не указать опцию -n, она автоматически добавляет символ перевода строки после вывода данных.

Пример 3

Подготовить и выполнить следующую программу:

#!/bin/bash echo -n 'Write a name CAR1, CAR2 and press "Enter" :' read CAR1 CAR2echo $CAR1echo $CAR2

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

 

Для всех командных интерпретаторов существует возможность передавать в shell-программу аргументы из командной строки. Для этого используются встроенные переменные $0, $1,…,$9. Переменная $0 содержит имя интерпретируемого файла. Переменные $1..$9 соответствуют параметрам, переданным из командной строки в программу. Переменная $#-содержит количество переданных аргументов. Переменные $* и $@ содержат все аргументы, но в $@ все аргументы выделены кавычками. Командный файл запускается на выполнение с указанием после его имени значений передаваемых аргументов.

 

Пример 4

Подготовить и выполнить следующую программу, которая выводит два аргумента командной строки, имя исполняемого файла и количество переданных аргументов:

#!/bin/bashecho "Name:$0"echo "First argument:$1"echo "Second argument:$2"echo "Kolithestvo argumentov:$# "

 

Язык, встроенный в оболочку, в основном предназначен для операций с объектами файловой системы. Вместе с тем в нем есть возможность использования арифметических выражений, но эта возможность ограничена только целочисленной арифметикой и минимальным набором арифметических операций.Арифметические операции производятся с использованием оператора let, который имеет следующий синтаксис:

let<имя переменной ><арифметический оператор><выражение >Арифметическими операторами являются "+", "-", "*", "/" , % - деление с остатком и круглые скобки. Конструкция <выражение > имеет такой смысл, как и в обычном программировании.

 

Пример 5

Подготовить и выполнить программу вычисления выражения Y=A*X2 +B*X +C. Аргумент X ввести с помощью оператора read, коэффициенты A, B, C передать в программу как параметры командной строки.

 

Для выполнения сравнений двух значений используются операторы test или []. Их синтаксис:

test<значение> опция <значение>

или

[ <значение> опция <значение> ]

Если сравнение успешно, то оператор возвращает значение 0, иначе 1. Код завершения последней выполненной команды хранится в специальной переменной $?.

 

Примечание.Наличие пробелов после символа "[" и перед "]" обязательно.

Программа test предназначена для проверки следующих типов условий:

· проверка логических условий.

· проверка типов и наличия файлов,

· сравнение различных значений,

 

Программа может проверить два типа логических условий И (AND) и ИЛИ (OR)

Выражение1 -а Выражение2 — возвращает истину, если истинно и Выражение1, и Выражение2. Выражение1 -о Выражение2 — возвращает истину, если истинно или Выражение1, или Выражение2. Оператор ! инвертирует значение логического выражения.

Сравнение чисел происходит при помощи следующих операторов:

число1 -eq число2 — то же, что и "=". число1 -ne число2 — то же, что и "!=". число1 -gt число2 — то же, что и ">". число1 -ge число2 — то же, что и ">=". число1 -lt число2 — то же, что и "<". число1 -le число2 — то же, что и "<=".

Сравнение строк:

-n строка — истина, если строка имеет не нулевую длину. -z строка — истина, если строка имеет нулевую длину строка1 = строка2 — истина, если строка1 идентична строке2. При сравнении строк учитывается регистр символов.

Проверка типов и наличия файлов:

-e /путь/к/файлу — истина, если файл существует. -f /путь/к/файлу — истина, если файл существует и является обыкновенным файлом. -d /путь/к/файлу — истина, если файл существует и является каталогом. -L /путь/к/файлу — истина, если файл существует и является символьной ссылкой. -r /путь/к/файлу — истина, если файл существует и доступен для чтения. -w /путь/к/файлу — истина, если файл существует и доступен на запись. -x /путь/к/файлу — истина, если файл существует и доступен на выполнение. -s /путь/к/файлу — истина, если файл существует и имеет не нулевую длину.

 

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

1) if<условие>; then<операторы>fi

Примечание.Символы «<», «>»

Если проверяемое условие истина, тогда выполняется набор операторов, находящихся между ключевыми словами then и fi.Оператор if всегда должен завершаться оператором fi.

Оператор ifможет использоваться для проверки кода возврата какой-либо программы, например программы, которая выполняет команду языка. Если программа была выполнена успешно — она возвращает значение 0. Если во время выполнения программы возникли ошибки, она возвращает целое число, отличное от нуля.Таким образом, в shell script логическому значению «истина» приписывается число ноль. Все что не ноль — это «ложь».

Пример 6

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

#!/bin/bashread CARif [ $1 –eq $CAR ]; thenecho $CARfi

 

2) if<условие>; then<операторы>else<операторы>fi

В этом операторе в случае ложности условия операторы, следующие после then, пропускаются и выполняются операторы, следующие после else.

 

Пример 7

Подготовить и выполнить программу, аналогичную программе примера 6, в которой в случае несовпадения аргумента командной строки со значением переменной CAR вычисляется и выводится значение квадрата CAR.

 

3) case<строка>in<шаблон>) <операторы > ;; *) <операторы > ;; esac

Данная конструкция (оператор выбора сase) позволяет выбирать один из нескольких альтернативных вариантов. В нем строка поочерёдно сравнивается с шаблонами. Если шаблон совпадает, то выполняется группа операторов, находящихся между шаблоном и специальными символами ";;". После выполнения всех строк управление передается операторам, находящимся за ключевым словом esac.

 

Пример 8

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

#!/bin/bash echo -n "Nagmite [Y|yes] : " read YN case $YN in           [yY]|[yY][eE][sS])                           echo "Winagali $YN"                           ;;           *)                           echo "Ohibka" esac

 

В этом примере пользователя просят ввести "Y" или "yes" . Ответ пользователя помещается в переменную YN. При помощи оператора case проверяется, что он ввел. Поскольку регистр букв не учитывается, шаблон проверяет различные варианты написания слова. Если было введено то значение, которое запрашивалось, выполняется команда в строке 6. Если было введено любое другое значение, срабатывает шаблон по умолчанию и выводится сообщение об ошибке.

 

В языке shell script встроены два оператора, предназначенных для проверки условий логическое И — "&&", и логическое ИЛИ — "||".

Наиболее часто их применяют, когда необходимо проверить условие и, если оно истинно, выполнить одну команду или наоборот — не выполнять. Например:

[ -f file ]&& rm file

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

[ -f file ] || touch file

В этом примере проверяется наличие файла file. Если его не существует (первое условие ЛОЖЬ), вызывается программа touch, которая его создает. Для того что бы получилась ИСТИНА, хотя бы одно из условий должно возвратить значение ИСТИНА. Поэтому, если файл существует (ИСТИНА), программа touch не будет вызываться, так как нет необходимости в проверки второго условия. Если файл не существует (ЛОЖЬ), необходимо проверить второе условие — будет выполнена программа touch.

 

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

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

1. for<переменная>do<команды>done

2. for<переменная>in<список>do<команды>done

В первой форме оператора в цикле выполняются команды для каждого параметра, который был передан сценарию в командной строке.

Вторая конструкция отличается от первой тем, что параметры берутся не из командной строки, а из списка после оператора in. Элементы в списке могут разделяться символами пробела или табуляции. Если список не помещается на одну строку, его можно продолжить на следующей, но перед тем как нажать на <Enter> следует поставить символ "\" для экранирования значения символа перевода строки.

 

Пример 9

Подготовить и выполнить следующую программу:

#!/bin/bash for I in 1 2 3 4 5 6 7 8 9 10 do          echo "--> $I " done

 

Операторы цикла с неизвестным числом повторений имеют две обычные формы:

1. Цикл с предусловием

while<условие>do<команды>done

выполняет команды, пока условие истинно.

2. Цикл с постусловием

until<условие>do<команды>done

выполняет команды, пока условие ложно.

 

Пример 10

Подготовить и выполнить следующую программу:

#!/bin/bash X=1 while [ $X -lt 10 ] do          echo "--> $X "           X=$(( $X+1 )) done

 

В языке имеется еще одна конструкция, близкая по смыслу выполняемых действий к оператору цикла – оператор select:

select< переменная >in< список >do< команды >done

Оператор select выводит пронумерованный список на стандартный вывод и строку приглашения, в которой пользователь должен ввести номер элемента списка и нажать <Enter>. Затем значение выбранного элемента присваивается переменной и выполняются строки, расположенные между do и done. После этого опять выводится список, либо выводится приглашение на ввод номера элемента (зависит от версии shell).

 

Пример 11

Подготовить и выполнить следующую программу:

#!/bin/bash

select var in 1 2 3

docase $var in   1)echo Number 1   ;;   2)echo Number 2   ;;   3)echo Number 3   ;;   *)echo Other;;esacbreakdone

 

 










Последнее изменение этой страницы: 2018-06-01; просмотров: 412.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...