Студопедия

КАТЕГОРИИ:

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

Программирование в BASH-shell




 

Shell

 

Командный интерпретатор в среде UNIX выполняет две основные функции: 

- представляет интерактивный интерфейс с пользователем, т.е. выдает приглашение, и обрабатывает вводимые пользователем команды; 

- обрабатывает и исполняет текстовые файлы, содержащие команды интерпретатора (командные файлы).

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

Существует несколько типов оболочек в мире UNIX. Две главные - это «Bourneshell» и «Cshell». Bourneshell (или просто shell) использует командный синтаксис, похожий на первоначально для UNIX. В большинстве UNIX-систем Bourneshell имеет имя /bin/sh (где sh сокращение от «shell»). Cshell использует иной синтаксис, чем-то напоминающий синтаксис языка программирования Си. В большинстве UNIX-систем он имеет имя /bin/csh.

В Linux есть несколько вариаций этих оболочек. Две наиболее часто используемые, этоНовыйBourneshell (BourneAgainShell) или«Bash» (/bin/bash) иTcsh (/bin/tcsh). Bash - это развитие прежнего shell с добавлением многих полезных возможностей, частично содержащихся в Cshell.

Поскольку Bash можно рассматривать как надмножество синтаксиса прежнегоshell, любая программа, написанная на shshell должна работать и в Bash. Tcsh является расширенной версией Cshell. При входе в систему пользователю загружается командный интерпретатор по умолчанию. Информация о том, какой интерпретатор использовать для конкретного пользователя находится в файле /etc/passwd.

Возможно, вам захочется выполнить сценарий, написанный для одного из shellLinux, в то время как вы работаете в другом. Предположим, вы работаете в TCSH-shell и хотите выполнить написанный в BASH сценарий, содержащий команды этого (второго)shell. Сначала нужно с помощью команды sh перейти в BASH-shell, выполнить сценарий, а затем вернуться в TCSH. Эту процедуру можно автоматизировать, поставив первыми в сценарии символы #! и указав после них путевое имя программы нужного shell в вашей системе. Shell всегда изучает первые символы сценария и на их основании делает вывод о том, к какому типу shell этот сценарий относится - BASH, PDKSH или TCSH. Если первый символ - пробел, это сценарий BASH-shell или PDKSH-shell. Если первый символ - знак #, это сценарий TCSH-shell. Если первые символы - #!, то shell читает указанное за ними имя программы. После символов #! всегда должно следовать путевое имя программы нужного shell, по которому можно идентифицировать его тип. Если вы запускаете сценарий из shell, отличного от того, который указан в первой строке запускаемого сценария, то будет вызван shell, указанный в первой строке, и в нем выполнится ваш сценарий. В такой ситуации одного пробела или знака 41 для указания того, что это сценарий BASH или TCSH, бывает недостаточно. Такая идентификация работает только в собственных сценариях этих shell. Чтобы обозначить сценарий другого shell, необходимо поставить символы #! и путевое имя.Например, если поставить в начало первой строки сценария hello комбинацию символов #!/bin/sh, то этот сценарий можно будет выполнять непосредственно из TCSH-shell. Сначала сценарий осуществит переход в BASH, выполнит его команды, а затем вернется в TCSH (или в тот shell, из которого он выполнялся). В следующем примере сценарий helloсодержит команду #!/bin/sh. Пользователь выполняет сценарий, находясь в TCSH-shell.

 

Командные файлы

 

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

 

$ echo “ps–af”>commandfile

$ chmod +xcommandfile

$ ./commandfile

 

Впредставленномпримерекомандаecho“ps-af ” >commandfileсоздастфайлсоднойстрокой“ps–af”, командаchmod +xcommandfileустановитатрибутнаисполнениедляэтогофайла, команда ./commandfileосуществитзапускэтогофайла.

 

Переменные shell

 

Имя shell-переменной - это начинающаяся с буквы последовательность букв, цифри подчеркиваний. Значение shell-переменной - строка символов.

Например: Var = “String”илиVar = String

Команда echo $Var выведет на экран содержимое переменной Var т.е. строку“String”, на то что мы выводим содержимое переменной указывает символ “$”. Таккоманда echoVarвыведет на экран просто строку «Var».

Еще один вариант присвоения значения переменной Var = ‘набор команд Unix’.Обратные кавычки говорят о том, что сначала должна быть выполнена заключенная в них команда), а результат ее выполнения, вместо выдачи на стандартный выход, приписывается в качестве значения переменной.

 

CurrentDate = `date`

 

Переменной CurrentDate будет присвоен результат выполнения команды date.Можно присвоить значение переменной и с помощью команды “read”, котораяобеспечивает прием значения переменной с (клавиатуры) дисплея в диалоговом режиме.

 

echo “Введите число”

readX1

echo “вы ввели -” $X1

 

Несмотря на то, что shell-переменные в общем случае воспринимаются как строки, т. е. “35” - это не число, а строка из двух символов “3” и “5”, в ряде случаев они могут интерпретироваться иначе, например, как целые числа.

Разнообразные возможности имеет команда “expr”.

 

x=7

y=2

rez=’expr $x + $y’

echoрезультат=$rez

 

выдаст на экран результат=9    

 

Параметры командного файла

 

В командный файл могут быть переданы параметры. В shell используютсяпозиционные параметры (т.е. существенна очередность их следования). В командномфайле соответствующие параметрам переменные (аналогично shell-переменным) начинаются с символа “$”, а далее следует одна из цифр от 0 до 9. При обращении к параметрам перед цифрой ставится символ доллара “$” (как и при обращении к переменным):

$0 соответствует имени данного командного файла; 

$1 первый по порядку параметр; 

$2 второй параметр и т.д. 

Поскольку число переменных, в которые могут передаваться параметры,ограничено одной цифрой, т.е. 9-ю ("0", как уже отмечалось имеет особый смысл), то для передачи большего числа параметров используется специальная команда "shift".

Команда “set” устанавливает значения параметров. Это бывает очень удобно.Например, команда “date” выдает на экран текущую дату, скажем, “MonMay 01 12:15:102002”, состоящую из пяти слов, тогда set‘dateecho $1 $3 $5’ выдаст на экран “Mon 01 2002”.

 

Программные структуры

 

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

 

Команда test

 

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

 

test условие

  или 

 [ условие ]

 

В shell используются условия различных "типов". 

Условия проверки файлов: 

 

-ffileфайл "file" является обычным файлом; 

 

-dfile файл "file" - каталог; 

 

-с file файл "file" - специальный файл; 

 

-rfileимеется разрешение на чтение файла "file";

 

-wfileимеется разрешение на запись в файл "file";

                                                                                        7

-sfile  файл "file" не пустой. 

 

Условия проверки строк: 

 

str1 = str2 строки "str1" и "str2" совпадают; 

 

str1 != str2 строки "str1" и "str2" не совпадают; 

 

-nstr1 строка "str1" существует (непустая); 

 

-zstr1 строка "str1" не существует (пустая).

 

Условия сравнения целых чисел:

 

x -eqy"x" равно "y",

 

x -ney  "x" неравно "y",

 

x -gty  "x" больше "y",

 

x -gey  "x" больше или равно "y",

 

x -lty  "x" меньше "y",

 

x -ley  "x" меньше или равно "y".

 

То есть в данном случае команда "test" воспринимает строки символов как целые(!) числа. Поэтому во всех остальных случаях "нулевому" значению соответствует пустая строка. В данном же случае, если надо обнулить переменную, скажем, "x", то этодостигается присваиванием "x=0". Сложные условия реализуются с помощью типовыхлогических операций: 

 

! (not) инвертирует значение кода завершения. 

-o (or) соответствует логическому "ИЛИ". 

-a (and) соответствует логическому "И"

 

Управляющие структуры

 

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

Существует два вида управляющих структур: циклы и условия. Цикл используется для повторения команд, тогда как условие обеспечивает выполнение команды при соблюдении некоторых критериев. В BASH-shell используются три вида циклических управляющих структур (while, for и for-in) и две условные управляющие структуры (if и case).

Управляющие структуры while и if - это структуры общего назначения. Они используются, например, для выполнения итераций и принятия решений на основании различныхпроверок. Управляющие структуры case и for - более специализированные. Структура case представляет собой модифицированную форму условия if и часто используется для построения меню. Структура for - это цикл ограниченного типа. Здесь обрабатывается список значений, и на каждой итерации цикла переменной присваивается новое значение.

В управляющих структурах if и while проверка построена на выполнении Linux-команды. Все команды ОС Linux после выполнения выдают код завершения. Если командавыполнена нормально, выдается код 0. Если по какой-либо причине команда не выполняется, то выдается положительное число, обозначающее тип отказа. Управляющие структуры ifи while проверяют код завершения Linux-команды. Если код - 0,выполняются действия одного типа, если нет - другого.

 

Дополнительная информация

 

Во-первых, обязательно обратитесь к manbash.

Во-вторых, краткая памятка по командам, которые вам могут понадобиться:

 

pwd   Вывести текущую директорию.

 

hostname Вывести или изменить сетевое имя машины.

 

whoami Ввести имя под которым я зарегистрирован.

 

date        Вывести или изменить дату и время. Например, чтобы установить дату и время равную 2000-12-31 23:57, следует выполнить команду: date 123123572000

 

time   Получить информацию о времени, нужного для выполнения процесса + еще кое-какую информацию. Не путайте эту команду с date. Например: Я могу определить какмного времени требуется для вывода списка файлов в директории, набрав последовательность: time ls

 

who Определить кто из пользователей работает на машине.

 

rwho –a Определение всех пользователей, подключившихся к вашей сети. Для выполнения этой команды требуется, чтобы был запущен процесс rwho. Если такого нет - запустите setup "setup" под суперпользователем.

 

finger [имя_пользователя]Системная информация о зарегистрированном пользователе. Попробуйте: fingerroot

 

uptime   Количество времени прошедшего с последней перезагрузки.

 

ps –aСписок текущих процессов.

 

top Интерактивный список текущих процессов отсортированных по использованию 

cpu.uname Вывести системную информацию.

 

free  Вывести информацию по памяти.

 

df –h  (=место на диске) Вывести информацию о свободном и используемом месте на дисках (в читабельном виде).

 

du / -bh | more (=кто сколько занял) Вывод детальной информации о размере файлов по директориям начиная с корневой (в читабельном виде).

 

cat /proc/cpuinfoСистемная информация о процессоре. Заметьте, что файла в /proc директории - не настоящие файлы. Они используются для получения информации, известной системе.

 

cat /proc/interrupts Используемые прерывания.

 

cat /proc/version   Версия ядра Linux и другая информация

 

cat /proc/filesystems Вывести используемые в данный момент типы файловых систем.

 

cat /etc/printcap  Вывести настройки принтера.

 

lsmod  (как root) Вывести информацию о загруженных в данный момент модулях ядра.

 

set | more  Вывести текущие значения переменных окружения.

 

echo $PATH Вывести значение переменной окружения "PATH". Эта команда может использоваться для вывода значений других переменных окружения. Воспользуйтесь командой set, для получения полного списка.

grep …   Поиск вхождения регулярного выражения в строки заданного файла (потока).

 

Задания для выполнения

 

1. Вывести любое сообщение с помощью команды echo, перенаправив вывод:

- в несуществующий файл с помощью символа >;

- в несуществующий файл с помощью символа >>;

- в существующий файл с помощью символа >;

- в существующий файл с помощью символа >>.

Объяснить результаты. 

2. Переадресовать стандартный ввод для команды cat на файл.

3. Вывести сообщение с помощью команды echo в канал ошибок. Создать файлmyscript:

#!/bin/sh

echo stdout

echo stderr>&2

exit 0

Запустить его:

- без перенаправления (shmyscript);

- перенаправив стандартный вывод в файл, просмотреть содержимое файла (shmyscript>file1);

- перенаправить стандартный канал ошибок в существующий и несуществующий 

- файлы с помощью символов > и >> (а тут и дальше уже сами :) );

- перенаправив стандартный вывод в файл 1, стандартный канал ошибок - в файл 2; перенаправив стандартный вывод и стандартный канал ошибок в файл 3;

- перенаправив стандартный вывод в файл 4 с помощью символа >, а стандартный 

- канал ошибок в файл 4 с помощью символа >>.

   Объяснить результаты.

4. Вывести третью строку из последних десяти строк отсортированного в обратном порядке файла /etc/group.

5. Подсчитать при помощи конвейера команд количество блочных устройств ввода-вывода, доступных в системе.

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

7. Написать скрипт согласно индивидуальному заданию. Номер варианта согласовать с преподавателем.

 

Варианты индивидуальных заданий.

 

1. Написать командный файл, реализующий меню из трех пунктов: 1-ый пункт – ввести пользователя и вывести на экран все процессы, запущенные данным пользователем; 2-ой пункт - показать всех пользователей, в настоящий момент, находящихся в системе; 3-ий пункт – завершение.

2. Написать командный файл, реализующий меню из трех пунктов: 1-ый пункт - вывести всех пользователей, в настоящее время, работающих в системе; 2-ой пункт – послатьсообщение пользователю, имя пользователя, терминал и сообщение вводятся склавиатуры; 3-ий пункт – завершение.

3. Написать командный файл, реализующий меню из трех пунктов: 1-ый пункт - показать все процессы пользователя, запустившего данный командный файл; 2-ой пункт – послать сигнал завершения процессу текущего пользователя(ввести PID процесса); 3-ий пункт – завершение.

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

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

6. Реализовать Меню из двух пунктов: 1-ый пункт – определить количествозапущенных данным пользователем процессов bash (предусмотреть ввод имени пользователя); 2-ой пункт – завершить все процессы bash данного пользователя.

7. Реализовать Меню из трех пунктов: 1-ый пункт поиск файла в каталоге <Имяфайла> и <Имя каталога> вводятся пользователем; 2-ой пункт – копирование одного файла в другой каталог - <Имя файла> и <Имя каталога> вводятся; 3-ий пункт – завершение командного файла.

8. Написать командный файл который в цикле по нажатию клавиши выводитинформацию о системе, активных пользователях в системе, а для введенного имени пользователя выводит список активных процессов данного пользователя.

9. Реализовать командный файл который при старте выводит информацию осистеме, информацию о пользователе, запустившем данный командный файл, далее в цикле выводит список активных пользователей в системе – запрашивает имя пользователя и выводят список всех процессов bash запущенных данным пользователем.

10. Реализовать командный файл, позволяющий в цикле посылать всем активнымпользователям сообщение – сообщение вводится с клавиатуры. Командный файл при старте выводит имя компьютера, имя запустившего командный файл пользователя, тип операционной системы, IP-адрес машины.

11. Реализовать командный файл, позволяющий в цикле посылать всем активнымпользователям (исключая пользователя, запустившего данный командный файл) сообщение – сообщение вводится с клавиатуры. Командный файл при старте выводит имя компьютера, имя запустившего командный файл пользователя, тип операционной системы, список загруженных модулей.

12. Реализовать командный файл, который при старте выводит информацию осистеме, информацию о пользователе, запустившем данный командный файл, далее в цикле выводит список активных пользователей в системе – запрашивает имя пользователя и выводят список всех терминалов, на которых зарегистрирован этот пользователь.

13. Реализовать командный файл, который выводит: дату, информацию о системе, текущий каталог, текущего пользователя, настройки домашнего каталога текущего пользователя, далее в цикле выводит список активных пользователей – запрашивает имя пользователя и выводит информацию об активности данного пользователя.

14. Реализовать командный файл, который выводит: дату в формате день – месяц – год – время; информацию о системе в формате: имя компьютера: версия ОС: IP адрес: имя текущего пользователя: текущий каталог; настройки домашнего каталога текущего пользователя; основные переменные окружения. Далее в цикле выводит список активных пользователей – запрашивает имя пользователя и выводит информацию об активности введенного пользователя.

15. Реализовать командный файл, реализующий символьное меню(в цикле):

1 Пункт: вывод полной информации о файлах каталога: ввести имя каталога дляотображения;

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

3 Пункт:выход:при старте командный файл выводит информацию об имени компьютера, IP-адреса, и список всех пользователей, зарегистрированных в данный момент на компьютере.

16. Реализовать командный файл, реализующий символьное меню(в цикле):

1 Пункт: вывод полной информации о файлах каталога: ввести имя каталога дляотображения;

2 Пункт: создать командный файл: файл вводится с клавиатуры по запросу, далее изменяются атрибут файла на исполнение, затем вводится с клавиатуры строка, которую будет исполнять командный файл. После изменения атрибутов вывести на экран расширенный список файлов для проверки установленных атрибутов и запустить созданный командный файл;

3 Пункт:выход:при старте командный файл выводит информацию об имени компьютера, IP-адреса, и список всех пользователей, зарегистрированных в данный момент на компьютере.

17. Реализовать командный файл, реализующий символьное меню:

1 Пункт:работа с информационными командами(реализовать все основные информационные команды);

2 Пункт:копирование файлов: в этом пункте выводится информация о содержимом текущего каталога, далее предлагается интерфейс копирования файла: ввод имени файла и ввод каталога для копирования. По выполнению пункта выводится содержимое каталога, куда был скопирован файл и выводится содержимое скопированного файла;

3 Пункт:выход.

18. Написать скрипт с использованием цикла for, выводящий на консоль размеры и права доступа для всех файлов в заданном каталоге и всех его подкаталогах (имя каталога задается пользователем в качестве первого аргумента командной строки).

19. Написать скрипт, находящий в заданном каталоге и всех его подкаталогах все файлы, владельцем которых является заданный пользователь. Имя владельца и каталог задаются пользователем в качестве первого и второго аргумента командной строки. Скрипт выводит результаты в файл (третий аргумент командной строки) в виде полный путь, имя файла, его размер. На консоль выводится общее число просмотренных файлов.

20. Написать скрипт поиска одинаковых по их содержимому файлов в двух каталогах, например, Dir1 и Dir2. Пользователь задает имена Dir1 и Dir2 в качестве первого и второго аргумента командной строки. В результате работы файлы, имеющиеся в Dir1, сравниваются с файлами в Dir2 по их содержимому. На экран выводятся число просмотренных файлов и результаты сравнения.

 

 


 

лАБОРАТОРНАЯ РАБОТА №2

Программирование в BASH


Цель работы

 

Изучить основные shell-оболочки, используемые в операционных системах класса Unix. Получить навыки создания BASH-скриптов в ОС Linux.

 

Общие сведения

 

Более полные сведения по теме «Программирование в BASH» можно получить, изучив «BASHProgramming - IntroductionHOW-TO» и ознакомившись с man страницами для bash.

Программирование в BASH заключается в написании shell-скриптов, в соответствии с синтаксисом языка BASH. Такие скрипты обычно имеют расширение sh и для получения возможности запуска должны иметь соответствующие атрибуты.

Скрипт-файл имеет следующую структуру:

#!/bin/bash

...

 

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

Пример простейшего BATH-скрипта, выводящего на экран сообщение приведен ниже.

 

#!/bin/bash         

echo Hello World!

 

Ниже кратко рассмотрены основные моменты языка BASH.

 

Переменные

В BATH-скриптах можно использовать переменные аналогично другим языкам программирования. Типы данных отсутствуют. Переменная может представлять собой число, символ или строку символов. Нет необходимости объявлять переменную, поскольку присвоение ей значения автоматически создаёт её.

Переменные делятся на локальные и глобальные. Локальные создаются с использованием ключевого слова local. Примеры:

 

Использование глобальной переменной Использование локальной переменной
#!/bin/bash          STR="Hello World!" echo $STR    #!/bin/bash HELLO=Hello function hello        {        local HELLO=World        echo $HELLO        } echo $HELLO hello echo $HELLO

 

Пример скрипта с переменными:

 

#!/bin/bash         

d="Текущаядата: "$(date +%m)-$(date +%d)-$(date +%Y)

echo $d

 

Чтение пользовательского ввода с помощью read

Использование read является одним из способов ввода с клавиатуры пользовательских данных. Например:

 

#!/bin/bash

echo "Введите, пожалуйста, Ваше имя и фамилию"

read FN LN #FN - First Name - имя; LN - Last Name - фамилия

echo "Hi! $LN, $FN !"

 

Арифметические вычисления

Арифметические вычисления в BASH-скриптах выполняются при помощи следующих конструкций:

 

echo $((1+1))

echo $[1+1]

 

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

 

echo 3/4|bc –l

 

Условные операторы

Условные операторы предоставляют возможность организации ветвлений в программах. Существует несколько форм условных операторов.

Элементарная конструкция оператора if в bash выглядит следующим образом:

 

if [выражение]; then

       # операторы 1

fi

 

Если выражением внутри квадратных скобок истинно, то выполняются операторы1, в противном случае выполняется следующий за fi оператор.

Более сложная конструкция if записывается в следующем виде:

 

if [выражение]; then

       #операторы1

else

       #операторы2

fi

 

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

 

#!/bin/bash

echo "Введите выражение 1: "

read T1

echo "Введите выражение 2: "

read T2

if [ "$T1" = "$T2" ]; then

       echo выражение вычислилось как истина

else

       echo выражение вычислилось как ложь

fi

 

Циклы for, while и until

Цикл for немного отличается от аналогов в других языках программирования. Прежде всего, он предоставляет возможность выполнять последовательные действия над "словами" в строке.

Цикл while выполняет фрагмент программы, если тестируемым выражением является истина; и останавливается при условии, если им является ложь (или внутри исполняемого кода встречается явно заданное прерывание цикла).

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

Примеры использования операторов организации цикла.

 

#!/bin/bash

for i in $( ls ); do

echo item: $i

done

 

В приведенном примере конструкция “i in $(ls)” позволяет заносить на каждой итерации цикла в переменную i различные значения, содержащиеся в $(ls).

Примерцикла while:

 

#!/bin/bash

COUNTER=0

while [ $COUNTER -lt 10 ]; do

       echo The counter is $COUNTER

       let COUNTER=COUNTER+1

done

 

Примерцикла until:

 

#!/bin/bash

COUNTER=20

until [ $COUNTER -lt 10 ]; do

       echo COUNTER $COUNTER

       letCOUNTER-=1

done

 

Функции

При программировании в BASH можно использовать функции аналогично любому другому языку программирования. Объявление функции имеет следующий синтаксис:

 

function my_func

{

# код функции

 }.

 

Вызов функции осуществляется по ее имени.

Пример функций с параметрами:

 

#!/bin/bash

functionprint

{

echo $1

}

print Hello

print World

 

Созданиепростыхменю

BASH содержит средства для создания простейших меню. Для этого используется директива select.Ее синтаксис аналогичен синтаксису директивы for. Ниже приведен пример создания простейшего меню.

 

#!/bin/bash

OPTIONS="PrintQuit"

selectoptin $OPTIONS; do

if [ "$opt" = "Quit" ]; then

       exit

elif [ "$opt" = "Print" ]; then

       echoSelect "Print"

else

       clear

       echo Bad option

       exit

fi

done

 

Использование командной строки

После вызова BASH программы переменные %1, %2 и т.д. содержат соответственно первый второй и т.д. Параметры командной строки введенные пользователем. Ниже приведен пример использования командной строки.

 

#!/bin/bash

if [ "$2" != "" ]; then

       echo Параметр 1: "$1"

       echo Параметр 2: "$2"

else

       echo Необходимы два параметра

fi

 

Задания для выполнения

 

Разработать bash-скрипт в соответствии с вариантом задания.

 

Варианты индивидуальных заданий.

 

1. Разработать программу вычисления суммы, среднего арифметического, максимума и минимума последовательности чисел вводимых с клавиатуры. Количество чисел последовательности задается пользователем. Результат выводится в файл.

2. Разработать программу копирования содержимого первого файла во второй. Имена файлов вводятся в командной строке.

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

4. Разработать программу, производящую архивирование одного из подкаталогов домашнего каталога пользователя, в файл, имя которого содержит текущую дату. Архивный файл должен помещаться в /tmp.

5. Разработать программу, осуществляющую поиск всех файлов соответствующих маске (поиск начинается с корневого каталога) и помещающих их список в файл. Маска и имя выходного файла передаются в программу через командную строку.

6. Разработать программу вычисления факториала n!. Величина n вводится в командной строке.

7. Разработать программу, создающую в каталоге /tmp подкаталог, имя которого содержит текущую дату и осуществляющую копирование в него файлов соответствующих маске и содержащихся в каталоге, заданном путем. Маска и путь вводятся в командной строке.

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

9. Разработать программу записи в файл из вводимой с клавиатуры последовательности чисел, лишь тех, которые входят в диапазон, заданный с клавиатуры.

10. Разработать программу копирующую, удаляющую или переименовывающую файлы в текущем каталоге в соответствии с маской. Маска вводится в командной строке. Выбор операции осуществляется с использованием меню.

 


 

лАБОРАТОРНАЯ РАБОТА №3

Разработка CGI-программ на языке Perl


Цель работы

 

Приобрести навыки обработки данных на Web-сервере с помощью программ на языке Perl.

 

Общие сведения

Состав рабочего места

 

Оборудование: IBM-совместимый персональный компьютер (ПК).

Программное обеспечение: операционная система Windows, Web-браузер InternetExplorer версии 5.5 и выше, Web-сервер (Apache или IIS), инструментальные средства языка Perl. 

 

Технология работы с Perl

 

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

Текст программы содержит операторы языка Perl и комментарии. Комментарий в Perl начинается с символа "#".

Признаком окончания оператора является символ ";". Между элементами операторов должен быть хотя бы один пробел. Кроме того, разделителями могут служить также табуляторы и символы перехода на новую строку. 

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

 

#!путь-к-интерпретатору-Perl

например,

       #! /usr/bin/perl

Хотя этот оператор имеет смысл только при работе под управлением UNIX (в среде Windows он игнорируется), имеет смысл указывать его для обеспечения переносимости программы в другую операционную систему.

Текст программы может сохраняться с произвольным именем, однако в Windows желательно (но не обязательно) сохранять его с расширением pl, например, hello.pl.

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

 

perlимя-файла

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

 

perlhello.pl.

 

ИнтерпретаторPerl не обращает особого внимания на то, как выглядит код, лишь бы он работал. Однако имеется возможность ука­зать интерпретатору Perl, чтобы тот более внимательно анализировал исходный код. На­пример, вывод информации о предупреждениях (опция -w), включенная в командную строку или в первую строку програм­мы, позволяет избежать многих неприятных ошибок. Интерпретатор Perl может предупреждать об использовании неопределенных переменных, однократном использовании имен и т.п.

Кроме ключа -w, в интерпретаторе Perl имеются и другие средства для вывода дополнительных предупреждений во время компиляции. Для этого ис­пользуется оператор usestrict.

Оператор usestrict называется директивой интерпретатора. Эта директива указывает Perl, что необходимо отслеживать различные ситуации, в которых потенциально возможны ошибки, и выводить сообще­ния об ошибках времени выполнения с информацией о текущем файле и блоке.

 

Переменные в языке Perl

 

В языке Perl существует три типа данных и соответственно им три типа переменных:

- скалярные переменные;

- массивы скалярных переменных;

- ассо­циативные массивы скалярных переменных (или хэш-массивы).

Скалярный тип является базовым типом, на основании которого строятся более сложные структуры данных. Скалярная переменная содержит одно значение, которое может быть числом, строкой или ссылкой на другую пе­ременную. В Perl каждый скаляр (или переменная скалярного типа) может содержать от­дельное слово, запись, документ, строку текста, символ или ссылку на другую пе­ременную. Скаляры Perl могут со­держать также литеральные данные, т.е. данные, значение которых не изменяется во время выполнения программы. В некоторых языках программирования для такого рода данных используются термины константа или литерал.

Perl содержит два различных типа скалярных литералов:числовые и строковые литералы.

Числовые литералы могут быть целыми числами, числами с десятичной точкой и числами, записанными в экспоненциальной форме. Числовые литералы могут быть записаны, помимо десятичной формы, также в восьмеричной, шестнадцатеричной и двоичной формах. Признаком того, что число представлено в восьмеричной форме, является 0 впереди числа. Признаком записи в шестнадцатеричной форме являются символы "0X" или "0x" впереди числа. И, наконец, признаком записи в двоичной форме является наличие "0B" или "0b" перед числом.

Строковые литералы в Perl могут содержать любое количество данных, а также могут быть пустыми. Строковые литералы заключаются в одинарные (' '), или двойные кавычки (" "), например, 'abc', "привет".

Если внутри кавычек нужно поместить символ кавычки, перед ним необхо­димо поставить символ обратной косой черты (обратный слеш). Этот символ, используемый внутри строко­вого литерала, говорит Perl, что идущий за ним символ не должен восприниматься как управляющий, например, 'don\'t'. То же самое относится и к двойным кавычкам.

Основное отличие между одинарными и двойными кавычками заключается в том, что строка в одинарных кавычках является литералом в чистом виде. Поэтому ее содержимое никак не интерпретируется Perl. В строках, заключенных в двойные кавыч­ки, могут находиться имена переменных и последовательности управляющих символов. Для хранения скалярных данных в Perl используются скалярные переменные.

Особенностью языка Perl является то, что переменные в программе не нужно явно описывать перед их использованием. Тип переменной определяется начальным символом, предшествующим ее имени. Признаком скалярной переменной является начальный символ "$". За символом доллара, называемым идентификатором типа, следует имя переменной. Имена переменных в Perl подчиняются следующим правилам:

- имена переменных должны состоять из символов латинского алфавита (az и AZ), цифровых символов или символа подчеркивания, причем первый символ переменной не может быть цифрой;

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

Кроме того, в Perl зарезервированы имена некоторых односимвольных переменных. Такие переменные, как $_, $", $/, $2 и $$, называются специальными и их не следует использовать как обычные переменные в Perl-программах.

Так переменная $_используется в выражениях, если явно не указана другая переменная.

Для неинициализиро­ванных переменных Perl использует значение, принятое по умолчанию. Если пере­менная используется как число (например, в математическом выражении), ее значе­ние по умолчанию – 0 (нуль), если переменная используется как строка (т.е. почти во всех остальных случаях), используется "", или пустая строка.

 










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

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