Разделы презентаций


Программирование на языке shell

Содержание

При рассмотрении команд в UNIX по сути использовался интерактивный режим взаимодействия с shell, в котором можно: - ввести команду; - сделать перадресацию (перенаправление); - создать конвейер. Но это только часть возможностей написания программ на

Слайды и текст этой презентации

Слайд 1
Программирование на языке shell

Программа shell является одной из наиболее

важных утилит OC UNIX.
shell - это не только интерпретатор

команд системы UNIX ( типа command.com в DOS), но еще и язык программирования на уровне таких команд (то есть можно создавать файлы типа '.bat' как в DOS).
Программирование на языке shell		Программа shell является одной из наиболее важных утилит OC UNIX. 		shell - это

Слайд 2
При рассмотрении команд в UNIX по сути использовался интерактивный

режим взаимодействия с shell, в котором можно:
- ввести команду;
- сделать

перадресацию (перенаправление);
- создать конвейер.

Но это только часть возможностей написания программ на языке shell, версий которых очень много:
При рассмотрении команд в UNIX по сути использовался интерактивный режим взаимодействия с shell, в котором можно:		-

Слайд 3
- командный процессор Борна – sh (более старый);
- командный

процессор С – csh (более новый, но много различий в

этих двух языках);
- командный процессор Корна – ksh (полностью совместим С Борном и включает многие черты С).
- командный процессор Борна – sh (более старый);	- командный процессор С – csh (более новый, но

Слайд 4
Любая хранимая в файле команда или последовательность команд системы

UNIX называется shell-программой или командным файлом.
Обычно командным файлом называют

простую последовательность команд, а "shell-программой" - их более сложные структуры: с ветвлением, с циклом и др.

Существуют три способа инициализации shell для выполнения командных файлов.
Любая хранимая в файле команда или последовательность команд системы UNIX называется shell-программой или командным файлом. 		Обычно

Слайд 5
Этот метод основан на переадресации ввода не с терминала,

а с файла. Пусть файл lsdir содержит некоторые команды, тогда

можно выполнить:
sh < lsdir
В первом случае есть недостаток - нельзя передавать аргументы.
Поэтому существует возможность в shell читать команды с файла, хранимые на диске. Это можно сделать просто:
sh lsdir
Этот метод основан на переадресации ввода не с терминала, а с файла. Пусть файл lsdir содержит

Слайд 6
Здесь уже можно передавать аргументы, если Вы их предусмотрели.


Например,
sh lsdir /bin/etc
Если в файле право доступа на выполнение не подавлено

( установить такой доступ можно командой chmod a+x lsdir ), то тогда выполнить действие по команде из файла lsdir можно просто, набрав
lsdir
Этот способ является наиболее предпочтительным и часто используется.
Здесь уже можно передавать аргументы, если Вы их предусмотрели. 	Например,			sh	 lsdir	/bin/etc	Если в файле право доступа на

Слайд 7
shell переменные
Переменные в системе shell должны начинаться с буквы,

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

к регистру. Они могут быть любой длины из заглавных, строчных букв, также содержать цифры и специальные символы. Но они не должны начинаться с цифры и не могут содержать спец символы командного интерпретатора (*, $, ?, [, ], <, >)

shell переменные		Переменные в системе shell должны начинаться с буквы, состоять из букв, цифр и знака подчеркивания.

Слайд 8
Присваивание значений переменным
Значение переменным можно присвоить по команде присваивания:
ux=u.UNIX
ux=INIX
Здесь

первым оператором значение u.UNIX присваивается shell-переменной "ux", а вторым -

ее значение меняется на новое. Желательно команды писать строчными буквами, а переменные – всегда прописными.
Примечание: Перед знаком = и после не должно быть пробелов.
Присваивание значений переменным		Значение переменным можно присвоить по команде присваивания:		ux=u.UNIX		ux=INIX		Здесь первым оператором значение u.UNIX присваивается shell-переменной

Слайд 9
Если необходимо присвоить переменной значение, содержащее пробелы, знаки табуляции

и символы новой строки, то оно должно быть заключено в

кавычки:
name="Titov Vladidmir Ivanovich"

Команда readonly (только читать) помечает переменную таким образом, что ее значение не может быть изменено:
readonly ux
Теперь, если выполнить для переменной ux команду
ux=uu.UNIX

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

Слайд 10
то будет выдано сообщение об ошибке
"ux: is read only".

Поэтому,

если в shell-программе значение переменной не должно меняться, то имеет

смысл применить команду readonly.

Если требуется получить список переменных, которые нельзя изменить, то надо выполнить одну команду readonly без параметров.

то будет выдано сообщение об ошибке

Слайд 11
Вновь создаваемые переменные локальны, то есть, эффективны только в

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

порождаемых интерпретатором, они должны быть отмечены как внешние с помощью оператора export.
Например, export ux помечает переменную ux внешней.
Отметка export существует вплоть до окончания работы shell. Список текущих внешних переменных можно получить командой export без параметров.
Вновь создаваемые переменные локальны, то есть, эффективны только в пределах текущего экземпляра shell.		При необходимости использовать их

Слайд 12
Использование переменных

При использовании значения переменной перед именем переменной должен

находиться символ $.
Этот символ информирует shell о том, что

следующее за ним имя относится к переменной, а не к файлу или к литералу.

Значения требуемых переменных можно вывести на экран по команде echo.
Использование переменных		При использовании значения переменной перед именем переменной должен находиться символ $. 		Этот символ информирует shell

Слайд 13
Например, по команде
echo $ux
будет выведено INIX, так как

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

значение, содержит пустую строку.
Поэтому при выполнении команды
echo $abc
на экран ничего не будет выводиться.
Например, по команде			echo $ux	будет выведено INIX, так как именно это значение было последним.		Переменная, которой не

Слайд 14
Если имя переменной заключить в фигурные скобки, то её

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

по команде
echo ${ux}tm
будет напечатано UNIXtm.
Конструкция ${} используется, чтобы уточнить ссылку на переменную. Эта конструкция показывает, где заканчивается имя переменной и начинается текст, который следует добавить.
Если имя переменной заключить в фигурные скобки, то её выведенное значение будет сопровождаться последовательностью символов, следующих

Слайд 15
Интерпретатор shell автоматически присваивает значения следующим пяти встроенным переменным:
$? -

значение, возвращаемое последней выполненной командой
(код возврата:
- равен 0

при успешном выполнении,
- при других неравен 0);
$$ - идентификационный номер процесса shell;

Интерпретатор shell автоматически присваивает значения следующим пяти встроенным переменным:	$?	- значение, возвращаемое последней выполненной командой 	(код возврата:

Слайд 16
#! - идентификационный номер фонового процесса, запускаемого интерпретатором shell;

$# - число

аргументов позиционных параметров, передаваемых в shell;
$* - список аргументов,

переданных в shell.

$- - флаги, передаваемые в shell при его запуске или установленной командой set.

#!	- идентификационный номер фонового процесса, запускаемого интерпретатором shell;	$#	- число аргументов позиционных параметров, передаваемых в shell; 	$*

Слайд 17
Эти переменные равнозначны переменным, создаваемым пользователем.
Например, по команде


echo $$
выведется идентификационный номер shell. Его можно проверить с

помощью команды ps.
Эти переменные равнозначны переменным, создаваемым пользователем. 		Например, по команде 			echo $$ 	выведется идентификационный номер shell. Его

Слайд 18
Использование shell-переменных в интерактивном режиме

shell-переменные можно использовать в интерактивном

режиме.
Предположим, что мы работаем с каталогом '/usr/src/my/doc/'.
Чтобы его

не писать во всех командах, это имя можно присвоить переменной
mydir=/usr/src/my/doc/
Использование shell-переменных в интерактивном режиме		shell-переменные можно использовать в интерактивном режиме.		 Предположим, что мы работаем с каталогом

Слайд 19
После этого мы можем:
проверить корректность указанного имени по команде

echo $mydir
получить список файлов каталога по команде ls $mydir
вывести на экран

файл из этого каталога по команде cat $mydir/doc_unix.txt
выполнить программу myprog, хранящуюся в этом каталоге. Для этого присвоим полное имя новой переменной. Это можно сделать двумя способами:
После этого мы можем:	проверить корректность указанного имени по команде echo $mydir	получить список файлов каталога по команде	ls

Слайд 20
my_prog = /usr/src/my/doc/myprog
my_prog = $mydir/myprog

тогда ввод строки
my_prog $mydir/doc_unix.txt
приведет к выполнению

программы myprog с параметром doc_unix.txt.

my_prog = /usr/src/my/doc/myprog	my_prog = $mydir/myprog	тогда ввод строки			my_prog	$mydir/doc_unix.txt	приведет к выполнению программы myprog с параметром doc_unix.txt.

Слайд 21
Строки поиска пути
Как и в Dos, в UNIX-shell есть

shell-переменная PATH, по которой рассматриваются пути поиска файлов.

Обычно в

нем находятся:
- каталог /bin
- каталог /ust/bin
- текущий каталог.
Строки поиска пути		Как и в Dos, в UNIX-shell есть shell-переменная PATH, по которой рассматриваются пути поиска

Слайд 22
В строке поиска пути каталоги разделены двоеточиями, а для

указания текущего каталога служит пустое имя.
Это пустое имя может

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

Слайд 23
Например,
PATH = :/usr/bin:/bin:usr/mi/bin

Чтобы строки поиска пути инициализировались при запуске

shell, необходимо чтобы в Вашем начальном каталоге располагался файл по

имени ".profile" с этими строками.
Например,		PATH = :/usr/bin:/bin:usr/mi/bin		Чтобы строки поиска пути инициализировались при запуске shell, необходимо чтобы в Вашем начальном каталоге

Слайд 24
Отмена специального смысла символа
Существует три метода отмены специального смысла

символа:
Путем вставки обратной косой черты (\) перед символом;
Путем заключения всех

символов последовательности в одинарные кавычки (‘).
При этом теряют специальный смысл три знака:
- знак $ (доллара);
- знак ’ (кавычки);
- знак ” (двойных кавычек).
Отмена специального смысла символа		Существует три метода отмены специального смысла символа:Путем вставки обратной косой черты (\) перед

Слайд 25
Путем заключения всех символов
последовательности в двойные кавычки.
При этом

не теряют специальный смысл четыре знака:
- знак \ (обратная косая

черта);
- знак ` (знака ударения/апострофа);
- знак ' (кавычки);
- знак $ (доллара).
Путем заключения всех символов	последовательности в двойные кавычки. При этом не теряют специальный смысл четыре знака:	- знак

Слайд 26
Одинарные кавычки ‘’ указывают командному интерпретатору сохранить и не

интерпретировать текст внутри них (то есть спрятать любые спец символы

от командного процессора).
Двойные кавычки “” используются, чтобы сгруппировать вместе слова для формирования параметра или предложения. Но в них возможна интерпретация переменных.
Одинарные кавычки ‘’ указывают командному интерпретатору сохранить и не интерпретировать текст внутри них (то есть спрятать

Слайд 27
Пример:

Term=ansi
a) echo ‘Output $Term’
b) echo “Output $Term”
В первом случае

будет выведено
Output $Term
а во втором
Output ansi

Пример:		Term=ansi		a) echo ‘Output $Term’		b) echo “Output $Term”		В первом случае будет выведено			 Output $Term		а во втором			 Output

Слайд 28
Апостроф ` наклонная одинарная кавычка (расположена на клавише, что

и тильда ~) применяется для замещения команды:
а) выполнить команду и

сохранить результаты в переменной;
б) выполнить команду и передать ее выходные данные другой команде.
Примеры:
А) echo `ls /bin/c*`
Командный процессор видит апострофы и выполняет команду ls, а затем помещает полученную информацию в команду echo.
Апостроф ` наклонная одинарная кавычка (расположена на клавише, что и тильда ~) применяется для замещения команды:	а)

Слайд 29
Результат может быть такой:
/bin/cat
/bin/cc
/bin/chmod
/bin/csh

Б) PWD=`pwd`
Сохранение имени текущего каталога в

переменной PWD. Поэтому при применении команды echo $PWD , будет

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

Результат может быть такой:		/bin/cat		/bin/cc		/bin/chmod		/bin/csh	Б) PWD=`pwd`		Сохранение имени текущего каталога в переменной PWD. Поэтому при применении команды echo

Слайд 30
pwd
PWD=`pwd`
echo $PWD
cd /tmp
pwd
………
sd $PWD
pwd

pwd		PWD=`pwd`		echo $PWD		cd /tmp		pwd		………		sd $PWD		pwd

Слайд 31
Для отмены специального смысла одного символа - надо применить

обратную косую черту (\).
Для группы символов это рекомендуется применять

в случаях, когда Вы хотите shell-переменной присвоить последовательность слов, разделенных пробелами.
Например, в случае
ps_10 = Student Titov Vladimir
переменной будет присвоено только слово Student и выдано аварийное сообщение, что команд и программ с именами Titov и Vladimir не найдены.
Для отмены специального смысла одного символа - надо применить обратную косую черту (\). 		Для группы символов

Слайд 32
Поэтому надо сделать:
ps_10='Student Titov Vladimir'
или
="Student Titov Vladimir"
или
=Student\

Titov\ Vladimir

Эти все три способа равноценны.

Поэтому надо сделать:		ps_10='Student Titov Vladimir' 	или			=

Слайд 33
Команда set
Команда set (установить) предназначена для вывода списка созданных

переменных.
Чаще всего в нем выводится, кроме Вами созданных переменных,

еще и следующие:
- TERM = vt100- тип терминала;
- PS1 = '$'- первичная подсказка, которую выводит интерпретатор shell, когда он готов принимать команду;
- PS2 = '>'- вторичная подсказка, которую выводит копия shell (то есть, вторично запущенный интерпретатор shell);
Команда set		Команда set (установить) предназначена для вывода списка созданных переменных. 		Чаще всего в нем выводится, кроме

Слайд 34
- PATH = /bin::/usr/bin

- HOME = - имя Вашего

начального каталога;

- IFS = - внутренние разделители полей, которыми обычно

служат:
- пробел;
- табуляция;
- символы новой строки.


- PATH = /bin::/usr/bin	- HOME = - имя Вашего начального каталога;	- IFS = - внутренние разделители

Слайд 35
Команда set имеет несколько опций, но Мы рассмотрим только

одну:

-v - все входные строки, читаемые shell, выводятся на экран.
+v

- подавление вывода на экран входных строк.

Команда set имеет несколько опций, но Мы рассмотрим только одну:	-v - все входные строки, читаемые shell,

Слайд 36
Доступ к отдельным аргументам
Когда команда set применяется одновременно с

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

команды присваивается отдельному позиционному параметру.
Для задания подстановки результата выполнения команды в следующем примере команда date заключена в знаки апострофа ` (самая левая клавиша в цифровом ряде):
set `date`
Доступ к отдельным аргументам		Когда команда set применяется одновременно с подстановкой результата выполнения команды, каждый из элементов

Слайд 37
Выход команды date становится последовательностью аргументов для команды set

и поэтому на экране ничего не появится.

Если вызвать саму команду

date, то на экране можно будет увидеть:
date
Sun May 28 13:49:53 2011

Выход команды date становится последовательностью аргументов для команды set и поэтому на экране ничего не появится.		Если

Слайд 38
После выполнения команды set `date` её результат будет присвоен

последовательности параметров
$1, $2, $3, $4, $5

Теперь можно выводить

на экран в любом удобном виде.
Например:
echo 'DATE: $3 $2 $1 $5 TIME: $4'
На экран будет выведено:
DATE: 29 May Sun 2011 TIME: 13:49:53
После выполнения команды set `date` её результат будет присвоен последовательности параметров 		$1, $2, $3, $4, $5

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

происходит по команде shift (сдвиг), которая сдвигает аргументы на одну

позицию влево:
($1 <= $2, $2 <= $3 и т.д.),
но имя команды в позиции $0 остается без изменения.
Интерпретатор shell воспринимает символ звездочки * как метасимвол для генерации номера любого позиционного параметра.
Доступ к другим позиционным параметрам с номерами, больше девяти, происходит по команде shift (сдвиг), которая сдвигает

Слайд 40
Путем ввода следующей команды можно получить доступ ко всем

позиционным параметрам вызова:
shift
echo $*
arg2, arg3, ....., arg11, arg12
то есть, здесь

выводятся все - вплоть до последнего имеющегося параметра, тогда как команда:
echo $1 $2 $3 $4 $5 $6 $7 $8 $9
выведет только
$2 $3 $4 $5 $6 $7 $8 $9 $10

Путем ввода следующей команды можно получить доступ ко всем позиционным параметрам вызова:		shift		echo $*		arg2, arg3, ....., arg11,

Слайд 41
Простые условные операторы
Команда test | [ ]
Эта команда используется

совместно с командами while, until и if.
Они запускают команду

test и проверяют код возврата команды test.
Аргументы команды test образуют выражение, которое вычисляется при ее выполнении.
Если результат является true, то код возврата равен нулю, если false, то код возврата не равен нулю.
Простые условные операторы	Команда test | [ ]		Эта команда используется совместно с командами while, until и if.

Слайд 42
Команда [ ] является другим именем команды test.
Её

синтаксис [выражение]
Эти две команды используют выражение, которое применяется для сравнения

либо текста, либо числа , либо атрибутов файлов или каталогов.
Это выражение может браться из переменных, констант и операторов. Операторы могут быть строковыми, булевыми или файлами.
Команда [ ] является другим именем команды test. 	Её синтаксис 	[выражение]		Эти две команды используют выражение, которое

Слайд 43
Команда test может использоваться для трех объектов:
- файлов,
-

числовых выражений,
- цепочек символов.

Проверка файлов
В этом случае общий вид команды

имеет вид:
test опция имя_файла
Команда test может использоваться для трех объектов: 		- файлов,		- числовых выражений,		- цепочек символов.Проверка файлов	В этом случае

Слайд 44
Опции имеют вид:
-r - файл существует и его можно

прочитать;
-w - файл существует и в него можно записывать;
-x -

файл существует и может выполняться;
-f - файл существует и не является каталогом;
-d - файл существует и является каталогом;
-s - размер файла отличен от нуля.
Опции имеют вид:	-r - файл существует и его можно прочитать;	-w - файл существует и в него

Слайд 45
Сравнение числовых величин
В этом случае общий вид команды имеет

вид:
test А операция В
Операции имеют вид:
-eq - A = B
-ne - A ≠

B
-ge - A ≥ B
-gt - A > B
-le - A ≤ B
-lt - A < B
Сравнение числовых величин	В этом случае общий вид команды имеет вид:			test  А операция В	Операции имеют вид:	-eq	-	A

Слайд 46
Пример проверки целых чисел
test $int1 -eq $int2
или
[$int1 -eq $int2]

Пример проверки целых чисел		test $int1 -eq $int2			или		[$int1 -eq $int2]

Слайд 47
Сравнение цепочек символов

test -n существование цепочки символов
test -z отсутствие

цепочки символов
test =
равенство двух цепочек символов
test !=


неравенство двух цепочек символов
Сравнение цепочек символов	test -n 	существование 						цепочки символов	test -z 	отсутствие цепочки 					символов	test  = 					равенство двух цепочек

Слайд 48
Если цепочка символов заключена в двойные кавычки, то специальные

символы сохраняют свой смысл, и пробелы трактуются как символы.
Если Вы

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

Слайд 49
Пример:
Пусть Y = ' abcd', X = abcd
а) test

$Y = $X проверяет цепочки и не учитывает пробелы, поэтому результатом

будет true, то есть Y=X;
б) test “$Y” = “$X“ проверяет цепочки с учетом пробелов, поэтому результатом будет false, то есть Y ≠ X;
в) test '$Y' = '$X' проверяет цепочки, состоящие из двух символов. Первая $Y, а вторая - $X. Поэтому результатом будет false, так как $Y ≠ $X.
Пример:		Пусть Y = '  abcd', X = abcd	а)	test $Y = $X	проверяет цепочки и не учитывает

Слайд 50
Команды true и false
Команда true формирует код возврата 0,

а команда false - не ноль (чаще всего это 1).

Команды !,

-o, -a, &&, II
! - инвертирует значение выражения;
-o - логическое "или";
-a - логическое "и";
Пример:
if [$# -lt 2 –a $1 –ne 1]
здесь два выражения ($# -lt 2) и ($1 –ne 1) должны быть равными true.
Команды true и false		Команда true формирует код возврата 0, а команда false - не ноль (чаще

Слайд 51
Команды && и II позволяют контролировать выполнение.
&& означает, что

следующая за ней команда будет выполнена в том случае, если

предшествующая дала true, то есть код возврата, равным 0;
II означает, что команда, стоявшая после II, выполняется, если первая даст код возврата не 0 (false).
Условный оператор
Операторы && и II могут дать только простые условные структуры.
К более сложным операторам относится оператор if.
Оператор if в простом виде имеет следующий формат:
Команды && и II позволяют контролировать выполнение.	&& означает, что следующая за ней команда будет выполнена в

Слайд 52
if if_list then then_list fi

Альтернативная ветвь else
В этом случае условный

оператор имеет вид:
if if_list then then_list else else_list fi

Объединение операторов else и

if - elif
if if_list then then_list_1 elif elif_list then then_list_2 else else_list fi
if	if_list then then_list fi		Альтернативная ветвь else	В этом случае условный оператор имеет вид:	if	if_list then then_list else	else_list fi		Объединение

Слайд 53
Здесь elif выполняется, если if_list не равен нулю,

и состоит в следующем:

if elif_list then then_list_2 else else_list fi

В группе

может находиться только один блок if и один блок else, а количество elif может быть различным.



Здесь elif выполняется, если if_list  не равен нулю, и состоит в следующем:		if elif_list then	then_list_2 else

Слайд 54
Ветвление по
нескольким направлениям case
Её лучше применять в случае

большого числа if и else.
Данная структура предназначена для выполнения

ветвления по нескольким направлениям на основе совпадения образов.
Ветвление по нескольким направлениям case		Её лучше применять в случае большого числа if и else. 		Данная структура

Слайд 55
Ее общая форма такова:
case in
s1) ;;
s2) ;;
………………………….
sn)

;;
esac

Ее общая форма такова:	case in	s1)	;;	s2)	;;	………………………….	sn)  ;;	esac

Слайд 56
Команда case сравнивает шаблон string с каждым шаблоном s1,s2...

sn.

Если фиксируется совпадение, то будет выполняться список команд, который

следует за совпавшим со string шаблоном.

Синтаксис команды требует двойных точек с запятой (;;) в конце каждого списка и оператора esac в конце всей команды case.
Команда case сравнивает шаблон string с каждым шаблоном s1,s2... sn. 		Если фиксируется совпадение, то будет выполняться

Слайд 57
Одному списку команд может соответствовать несколько текстовых образцов, разделенных

вертикальной чертой, указывающий на дизъюнкцию.
s1|s2|s3)
Обычный смысл вертикальной черты как

конвейера в операторе case подавляется.
Последний шаблон желательно *), так как * соответствует любой последовательности.

Шаблон может содержать метасимволы shell
(* ? {…} […])
Одному списку команд может соответствовать несколько текстовых образцов, разделенных вертикальной чертой, указывающий на дизъюнкцию. 			s1|s2|s3)		Обычный смысл

Слайд 58
Пример:
case “$1” in
[1-9]) Number=True;;
A|a) dev=A;;
B|b dev=B;;
/dev/* dev=$1;;
esac
Здесь, если $1 отличное от нуля

число, то выполняется первый пункт. Если это буква a и

A, то выполняется второй пункт.
Пример:		case “$1” in	[1-9]) 	Number=True;;	A|a)	dev=A;;	B|b	dev=B;;	/dev/*	dev=$1;;		esac		Здесь, если $1 отличное от нуля число, то выполняется первый пункт. Если это

Слайд 59
Построение циклов
Цикл тип while
Синтаксис такого оператора следуюший:
while while_list do

do_list done
Вначале проверяется условие, а потом выполняется тело цикла.
Цикл типа

until
Синтаксис такого оператора следуюший:
until until_list do do_list done
Здесь цикл выполняется, пока until_list не равно 0 (то есть, пока until_list имеет значение false).
Построение циклов		Цикл тип while	Синтаксис такого оператора следуюший:	while while_list do do_list done		Вначале проверяется условие, а потом выполняется

Слайд 60
Цикл типа for
А) for с in
for name in for_list
do do_list
done

Переменной name присваивается

в качестве значения текущее слово списка.
Список операторов do_list выполняется один

раз для каждого слова из списка for_list.
Цикл типа for	А)	for с in	for 	name	in	for_list 		do	do_list		done			Переменной name присваивается в качестве значения текущее слово списка.			Список операторов

Слайд 61
Пример.
list = 'world_1 world_2 world_3 world_4'
for VAL in $list
do

echo $VAL done
echo 'End of list'
На экран будет выведено:
world_1
world_2
world_3
world_4
End of

list
Пример.	list = 'world_1 world_2 world_3 world_4'	for VAL in $list	do echo $VAL done	echo 'End of list'		На экран

Слайд 62
Б) for без in
Структура for может применяться и без ключевого слова

in.
for name
do do_list
done

В этом случае do_list выполняется один раз для

каждого позиционного параметра (аргумента) интерпретатора shell. Команда for name эквивалентна команде
for name in $*.
Б)	for	без	 in		Структура for может применяться и без ключевого слова in.	for	  name		do	do_list	done		В этом случае do_list выполняется

Слайд 63
Например, необходимо инвертировать порядок списка аргументов.
Для этого необходимо

выполнить:
list = ''
for arg
do list = "$arg $list"
done
echo $list
Если интерпретатор

shell запускался с параметрами 1 2 3 4 5, то будет выдано
5 4 3 2 1.
Например, необходимо инвертировать порядок списка аргументов. 		Для этого необходимо выполнить:	list = ''	for arg	do list =

Слайд 64
Кроме аргументов командной строки и позиционных параметров, могут обрабатываться

файлы, используя знаки подстановки:
for file in *
do echo “found $file”
done
В

этом примере выводится список файлов, находящихся в данном каталоге, по одному названию файла в строке.
for file in [ab]* ….
for file in a?? ….
Кроме аргументов командной строки и позиционных параметров, могут обрабатываться файлы, используя знаки подстановки:		for file in *			do

Слайд 65
Пустая строка
: - это команда обозначает отсутствие операции. Её

нельзя использовать в качестве комментария.
# - оператор комментария (игнорирует выполнение);
: - ничего

не делает.
if [ ! $1]
then : # Нет ничего
fi

Пустая строка	: - это команда обозначает отсутствие операции. Её нельзя использовать в качестве комментария.	#	- оператор комментария

Слайд 66
Данный пример показывает, что shell будет обрабатывать это, так

как двоеточие – это команда. Если просто подставить #, то

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

Данный пример показывает, что shell будет обрабатывать это, так как двоеточие – это команда. Если просто

Слайд 67
Прерывание цикла break
Оператор break прерывает очередное выполнение включающего самого

внутреннего его цикла. Например,
while true
do echo $Loop3
until false
do echo $Loop2
while

true
3 2 1 do echo $Loop1
break $level
done
done
done




Прерывание цикла break		Оператор break прерывает очередное выполнение включающего самого внутреннего его цикла. Например,	while  true		do	echo $Loop3		until

Слайд 68
Если переменная level отсутствует или равна 1, то прерывается

цикл 1.
Если level=2, то прерывается цикл 2,
и если

level=3, то прерывается цикл 3.

Прерывание итерации
цикла continue
Эта команда приводит к прерыванию выполнения итерации ближайшего цикла, в котором находится сама команда continue.

Если переменная level отсутствует или равна 1, то прерывается цикл 1. 		Если level=2, то прерывается цикл

Слайд 69
while true
do echo $Loop3
until false
do echo $Loop2
while true
do echo

$Loop1
continue $level
done
done
done




while  true			do	echo $Loop3			until false				do	echo $Loop2				while  true					do echo $Loop1					continue $level				done			done		done

Слайд 70
Если переменная level имеет значение 2, то выполнение будет

продолжено с оператора цикла until.

Если же значение будет равно

3, то будет возобновлен внешний цикл while.

Если же переменная level не установлена или равна 1, то будет продолжаться выполнение самого внутреннего цикла.
Если переменная level имеет значение 2, то выполнение будет продолжено с оператора цикла until. 		Если же

Слайд 71
Фоновое выполнение цикла
Если после done подставить &, то цикл

будет выполняться в фоновом режиме.
for var in 1 2 3

4 5
do echo “$var”
done &
это может быть применено и для циклов while и until.

Фоновое выполнение цикла		Если после done подставить &, то цикл будет выполняться в фоновом режиме.		for var in

Слайд 72
Выход из программы exit
Эта команда прекращает не просто текущий

цикл, а всей процедуры.

После выполнения команды exit в вызывающую

программу передается код возврата, равный нулю (true).

Если команда имеет аргумент, например, exit $status, то возвращается код возврата, равный значению переменной status.
Выход из программы exit		Эта команда прекращает не просто текущий цикл, а всей процедуры. 		После выполнения команды

Слайд 73
Переназначение ввода/вывода и циклы

Переназначение ввода
for var in *
do
команды
done

источник
Все команды в цикле получают данные через стандартный ввод. Можно

получить из перенаправленного источника (любая команда считывает данные из указанного источника).
Переназначение ввода/вывода и циклы			Переназначение ввода	for var in *		do			команды		done < источник		Все команды в цикле получают данные через

Слайд 74
for var in *
do
команды < источники
done
Здесь каждая команда может

брать входные данные с разных мест.

Переназначение вывода
Аналогично можно переназначить вывод:
for

var in 1 2 3 4 5
do
echo “$var”
done
for var in *		do			команды < источники		done		Здесь каждая команда может брать входные данные с разных мест.		Переназначение вывода	Аналогично

Слайд 75
Здесь все выходные данные всех команд в цикле направляются

в единый файл (стандартный вывод).

for var in 1 2 3

4 5
do
echo “Processing $var” > /dev/tty
команды
done > output
Здесь по команде echo данные направлены на tty, а по всем другим командам - в единый файл (стандартный вывод).
Здесь все выходные данные всех команд в цикле направляются в единый файл (стандартный вывод).	for var in

Слайд 76
Можно связать циклы и конвейеры:
ls | for file in

*
do
echo $file
file $file
done
Это пример перекачки данных в цикл из конвейера.

Команда file определяет тип файла.
Можно связать циклы и конвейеры:	ls | for file in *		do			echo $file			file $file		done			Это пример перекачки данных в

Слайд 77
for file in *
do
echo $file
done | wc –l
Здесь передача

информации в конвейер в конце цикла. Происходит печать имен файлов

и посылка по конвейеру команде wc –l для подсчета количества файлов.
for file in *		do			echo $file		done | wc –l			Здесь передача информации в конвейер в конце цикла. Происходит

Слайд 78
Подстановка результатов
выполнения команд

shell дает возможность использования стандартного вывода

любой команды в shell-программе.

Если команда заключена в знаки ударения

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

Слайд 79
Пример 1.
now = 'date'
В результате действия переменной now будет

присвоена текущая дата:
now = Wed Feb 12 11:49:23 1997
Теперь по

команде
echo $now
на экран будет выведена дата, хранящаяся в now.
Пример 1.		now = 'date'	В результате действия переменной now будет присвоена текущая дата:		now = Wed Feb 12

Слайд 80
Пример 2.
f_names = 'ls'
В этом случае переменной f_names будут

присвоены результаты выполнения команды ls.

Если в текущем каталоге было

4 файла с именами file_1, file_2, file_3, file_4, то при использовании команды для вывода
echo $f_names
на экране появится:
file_1 file_2 file_3 file_4
Пример 2.		f_names = 'ls'		В этом случае переменной f_names будут присвоены результаты выполнения команды ls. 				Если в

Слайд 81
Пример 3.
curr = 'pwd' Получение текущего каталога
cd /usr/bin/Mi/doc Переход в другой

каталог
................. Действия в этом каталоге
cd $curr Возврат в текущий каталог, то есть

не надо было его помнить!
Пример 3.		curr = 'pwd'		Получение текущего 					каталога		cd /usr/bin/Mi/doc	Переход в другой 						каталог	.................			Действия в этом 						каталоге		cd $curr			Возврат в текущий

Слайд 82
Вычисление выражений expr
Для выполнения арифметических операций в командном процессоре

Борна (в Корне и С – это встроено). Результат передается

на стандартный ввод.
Рассмотрим пример работы Борна:
a=1
b=$a + 1 (все аргументы отделяются пробелами)
echo $b
Будет выдано: $a + 1

Вычисление выражений expr	Для выполнения арифметических операций в командном процессоре Борна (в Корне и С – это

Слайд 83
То есть он текст “+1” конкатенирует с переменной a,

так как все цифры в Борне – это символы.

Вычисление арифметических

выражений
Команда expr рассматривает свои аргументы как выражения (арифметические или логические).
Результат вычисления передается на стандартный вывод.
То есть он текст “+1” конкатенирует с переменной a, так как все цифры в Борне –

Слайд 84
При этом могут быть использованы следующие операции:
+ - сложение
- - вычитание
* - умножение
/ - деление на цело
% - деление

по модулю ( взятие остатка)
В команде все аргументы необходимо отделять

пробелами.

Для предотвращения интерпретации специальных символов их надо отменять.
При этом могут быть использованы следующие операции:	+	-	сложение	-	-	вычитание	*	-	умножение	/	-	деление на цело	%	-	деление по модулю ( взятие остатка)		В команде все

Слайд 85
Примеры:
a = 2 a = 2
a

= `expr $a + 7` a = 9
b = `expr

$a / 3` b = 3
c = `expr $a - 1 ‘*’ $b` c = 24
d = `expr $c % 5` d = 4
e = `expr $d - $b` e = 1

Если применить expr 10 + 2, то будет выдано 10+2. При 10 - 2 и 10 * 2 будет выданы ошибки.

Примеры: 	 a = 2					a = 2	 a = `expr $a + 7`			a = 9

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

Команда expr с помощью операции двоеточия (:) позволяет сравнивать цепочки

символов.
Результатом выполнения такой команды является число совпадающих символов в обеих цепочках.
Если результат равен нулю, то совпадение отсутствует.
Сравнение цепочки символов		Эта команда может использоваться для сравнения цепочек. Команда expr с помощью операции двоеточия (:)

Слайд 87
R = `expr ‘abcdef’ : ‘abcd’`
echo $R
4

ВНИМАНИЕ!
Вторая цепочка символов

сопоставляется с первой цепочкой, начиная с первого символа.
Поэтому даже

один несовпадающий символ во второй цепочке приведет к неудачному сопоставлению, в следствии чего результатом будет ноль.
R = `expr ‘abcdef’ : ‘abcd’`	echo $R	4	ВНИМАНИЕ!			Вторая цепочка символов сопоставляется с первой цепочкой, начиная с первого

Слайд 88
Примеры несовпадения цепочек:
R = `expr ‘abcdef’ : ‘abce’` нет

символа d

T = `expr ‘abcdef’ : ‘bcd’` нет символа a

V = `expr

‘abcd’ : ‘abcdef’` вторая цепочка длиннее первой

echo $R $T $V будет выдано: 0 0 0
Примеры несовпадения цепочек:	R = `expr ‘abcdef’ : ‘abce’` нет символа	d	T = `expr ‘abcdef’	: ‘bcd’`  нет

Слайд 89
Такое сопоставление можно выполнить и с использованием переменных
M =

‘abcdef’
N = ‘abcd’
C = `expr $M : $N`

Применяя эту команду,

можно определить длину цепочки:
A = "This is an experement" Присваивание цепочки символов переменной A. Так как в ней есть пробелы, то ее заключаем в двойные кавычки.
Такое сопоставление можно выполнить и с использованием переменных		M = ‘abcdef’		N = ‘abcd’		C = `expr $M :

Слайд 90
count = `expr $A : ‘.*’`
Второй операнд .* говорит

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

а сам символ (.) означает любой символ.
Чтобы указать интерпретатору shell на специальный смысл символов (.) и (*), второй аргумент заключен в апострофы

echo $count
21
count = `expr $A : ‘.*’`		Второй операнд .* говорит о том, что символ (.) может повторяться

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

часть цепочки символов с помощью конструкции \(...\). Эти круглые скобки

– скобки регулярного выражения, которые используются для запоминания результата.
B = `expr $A : ‘….. \(.*\)’`
Здесь пять точек перед знаком \ соответствует пяти символам, которые следует пропустить ( включая пробел ) с начала цепочки символов.
echo $B
Результат операции:
is an experement
Другой возможностью команды expr является ее способность выделить только часть цепочки символов с помощью конструкции \(...\).

Слайд 92
Условная замена переменных
При условной замене значение одной переменной подставляется

вместо значения другой.
Интерпретатор shell реализует четыре варианта условно замены

с помощью 4-х символов: -, =, ?, +:
A. {VARIABLE - OTHER}
Если переменной VARIABLE было присвоено значение, то используется оно. В противном случае используется цепочка символов OTHER, а переменная VARIABLE не меняется.
Условная замена переменных		При условной замене значение одной переменной подставляется вместо значения другой. 		Интерпретатор shell реализует четыре

Слайд 93
B. {VARIABLE = OTHER}
Если переменной VARIABLE было присвоено значение, то

используется оно.
В противном случае перед использованием переменной VARIABLE ей

присваивается значение переменной OTHER.

C. {VARIABLE ? EMPTY}
Если переменной VARIABLE было присвоено значение, то используется оно.
В противном случае на экран выводится сообщение VARIABLE : EMPTY, а процедура прекращается.
B.	{VARIABLE = OTHER}		Если переменной VARIABLE было присвоено значение, то используется оно. 		В противном случае перед использованием

Слайд 94
При отсутствии аргумента справа от знака ? выдается стандартное

сообщение системы: VARIABLE : parametr not set

D. {VARIABLE + OTHER}
Если переменной

VARIABLE было присвоено значение, то используется значение переменной OTHER.
Если же значение переменной VARIABLE не присвоено, то в качестве ее значение используется пустая цепочка символов и при этом переменной VARIABLE значение не присваивается.
При отсутствии аргумента справа от знака ? выдается стандартное сообщение системы: VARIABLE : parametr not set	D.	{VARIABLE

Слайд 95
Примеры.
Пусть во всех примерах переменные
VAL и VAR не

определены.
A1. echo ${VAL - 123}
123
A2. SUB = 456
echo ${VAL - $SUB}
456
B. echo ${VAL

= xyz}
xyz
echo $VAL
xyz
Примеры.	Пусть во всех примерах переменные 	VAL и VAR не определены.	A1.	echo ${VAL - 123}		123	A2.	SUB = 456			echo ${VAL

Слайд 96
C1. Err = 'Переменная отсутствует. Процедура прервана'
echo ${VAR ?

Err}
VAR : Переменная отсутствует. Процедура прервана
C2. echo ${VAR ?}
VAR : parametr

not set
D. THIS = 145
THAT = abc
echo ${THIS + $THAT}
abc
echo $THIS
145
C1.	Err = 'Переменная отсутствует. 				 Процедура прервана'		echo ${VAR ? Err}			VAR : Переменная отсутствует. 			Процедура прервана	C2.	echo ${VAR

Слайд 97
Усложненное
присваивание переменным
В операторах присваивания можно присваивать значения нескольким

переменным.
Пример 1.
a = T b = H c = I d =

S
echo $a$b$c$d
THIS
Усложненное присваивание переменным		В операторах присваивания можно присваивать значения нескольким переменным.	Пример 1.		a = T	b = H	c =

Слайд 98
Пример 2.
А) a = 123
b = $a
echo $a $b
123 123
Б) z

= $y y = 123
echo $z $y
123 123
ВНИМАНИЕ!
В интерпретаторе shell присваивание переменным происходит

справа налево, а не наоборот.
Пример 2.	А) a = 123		b = $a		echo $a $b		123	123	Б)	z = $y	y = 123		echo $z	$y		123	123	ВНИМАНИЕ!		В интерпретаторе shell

Слайд 99
Пример 3.
x = 123 y = 456
string1 = `Величина $x

и $y`
string2 = "Величина $x и $y"
echo $string1
echo $string2
Величина $x

и $y
(Выводятся имена переменных, так как при апострофах специальный смысл знака $ теряется)
Величина 123 и 456
(В строках с двойными кавычками происходит интерполяция переменных)
Пример 3.		x = 123	y = 456		string1 = `Величина $x и $y`		string2 =

Слайд 100
Пример 4. Значение, присваемое переменной, может быть значением другой переменной.
A

= символ1
В этом примере дополнительные символы приписываются слева
B = мета$A

(то есть, с начала)
echo $B
На экран будет выведено: метасимвол1
Пример 4.	Значение, присваемое переменной, может быть значением другой переменной.		A = символ1			В этом примере дополнительные символы приписываются

Слайд 101
Для приписывания дополнительных символов к концу имени необходимо ставить

фигурные скобки.
B = мета
echo ${B}символ2
На экран будет выведено: метасимвол2
иначе будет

выведено сообщение, что переменная $Bсимвол2 отсутствует.
Для приписывания дополнительных символов к концу имени необходимо ставить фигурные скобки.		B = мета		echo ${B}символ2	На экран будет

Слайд 102
Позиционные параметры
Для идентификации позиций элементов в командной строке shell

устанавливает позиционные параметры.
Чтобы интерпретатор мог их различать друг от

друга, они должны разделяться пробелами.
При этом интерпретатор нумерует их, начиная с нуля.
Первый элемент (имя команды) всегда обозначается $0, первый аргумент - $1, второй - $2 и так далее до $9.
Позиционные параметры		Для идентификации позиций элементов в командной строке shell устанавливает позиционные параметры. 		Чтобы интерпретатор мог их

Слайд 103
shell использует 10 позиционных параметров и несколько специальных переменных

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

либо устанавливаются пользователем.
Пример.
grep cat enter
$0 $1 $2
shell не может одновременно обрабатывать более 10 параметров (то есть за один раз).
shell использует 10 позиционных параметров и несколько специальных переменных для работы с аргументами, которые вводятся либо

Слайд 104
Для этой цели применяется цикл и команда shift, чтобы

перенести позиционные параметры влево, но имя команды остается без изменения

в позиции $0.
shift
После этого:
$2 => $1
$3 => $2
$4 => $3 и так далее.

Для этой цели применяется цикл и команда shift, чтобы перенести позиционные параметры влево, но имя команды

Слайд 105

Присваивание значений
позиционным параметрам
Для этого применяется команда set.
Она

присваивает позиционному параметру значения цепочки символов аргументов.
set arg1 arg2 arg3

Присваивание значений позиционным параметрам		Для этого применяется команда set. 	Она присваивает позиционному параметру значения цепочки символов аргументов.		set	arg1	arg2	arg3

Слайд 106
По этой команде интерпретатор shell присваивает первому позиционному параметру

$1 значение arg1, второму - arg2 и т.д.
Значения этих

аргументов можно проверить, выведя их значения на экран:
echo $1 $2 $3
Будет выведено arg1 arg2 arg3
По этой команде интерпретатор shell присваивает первому позиционному параметру $1 значение arg1, второму - arg2 и

Слайд 107
Пример:
set `date`
Выход команды date становится последовательностью аргументов для команды

set и на экране ничего не отобразится.
Будет сформировано:
$1 - день

недели;
$2 - название месяца;
$3 - день месяца;
$4 - дата;
$5 - год.
Пример:		set `date`		Выход команды date становится последовательностью аргументов для команды set и на экране ничего не отобразится.		Будет

Слайд 108
Дополнительные переменные
командной строки.
$# - число аргументов в командной строке;
$* - все аргументы

до последнего, то есть и $11, $12 и так далее;
$@- все

аргументы в командной строке после того, как кавычки поставлены около каждого из них.
shift
echo $1 $2 … $9
arg2 arg3 ….arg10
Дополнительные переменные командной строки.	$#	-	число аргументов в командной строке;	$*	-	все аргументы до последнего, то есть и $11, $12

Слайд 109
echo $*
arg2 arg3 …. arg12

echo $*		arg2 arg3 …. arg12

Слайд 110
Отладка shell-программ
Для установки контроля над shell-программой при вызове команды

sh надо добавить одну из двух следующих опций:
-x - опция трассировки.
Эта

опция необходима для просмотра команд и аргументов по мере их выполнения.

-v - опция входного контроля. Производит отображение входных строк по мере их считывания.

Отладка shell-программ		Для установки контроля над shell-программой при вызове команды sh надо добавить одну из двух следующих

Слайд 111
Например, для отладки shell-процедуры filez надо ввести:
sh -x filez

Можно объединять опции

в одну:
sh -xv filez

Например, для отладки shell-процедуры filez надо ввести:		sh	-x	filez		Можно объединять опции в одну: 		sh	-xv	filez

Обратная связь

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

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

Это сайт презентации, докладов, проектов в PowerPoint. Здесь удобно  хранить и делиться своими презентациями с другими пользователями.


Для правообладателей

Яндекс.Метрика