Слайд 1
Программирование на языке shell
Программа shell является одной из наиболее
важных утилит OC UNIX.
shell - это не только интерпретатор
команд системы UNIX ( типа command.com в DOS), но еще и язык программирования на уровне таких команд (то есть можно создавать файлы типа '.bat' как в DOS).
Слайд 2
При рассмотрении команд в UNIX по сути использовался интерактивный
режим взаимодействия с shell, в котором можно:
- ввести команду;
- сделать
перадресацию (перенаправление);
- создать конвейер.
Но это только часть возможностей написания программ на языке shell, версий которых очень много:
Слайд 3
- командный процессор Борна – sh (более старый);
- командный
процессор С – csh (более новый, но много различий в
этих двух языках);
- командный процессор Корна – ksh (полностью совместим С Борном и включает многие черты С).
Слайд 4
Любая хранимая в файле команда или последовательность команд системы
UNIX называется shell-программой или командным файлом.
Обычно командным файлом называют
простую последовательность команд, а "shell-программой" - их более сложные структуры: с ветвлением, с циклом и др.
Существуют три способа инициализации shell для выполнения командных файлов.
Слайд 5
Этот метод основан на переадресации ввода не с терминала,
а с файла. Пусть файл lsdir содержит некоторые команды, тогда
можно выполнить:
sh < lsdir
В первом случае есть недостаток - нельзя передавать аргументы.
Поэтому существует возможность в shell читать команды с файла, хранимые на диске. Это можно сделать просто:
sh lsdir
Слайд 6
Здесь уже можно передавать аргументы, если Вы их предусмотрели.
Например,
sh lsdir /bin/etc
Если в файле право доступа на выполнение не подавлено
( установить такой доступ можно командой chmod a+x lsdir ), то тогда выполнить действие по команде из файла lsdir можно просто, набрав
lsdir
Этот способ является наиболее предпочтительным и часто используется.
Слайд 7
shell переменные
Переменные в системе shell должны начинаться с буквы,
состоять из букв, цифр и знака подчеркивания. Имена переменных чувствительны
к регистру. Они могут быть любой длины из заглавных, строчных букв, также содержать цифры и специальные символы. Но они не должны начинаться с цифры и не могут содержать спец символы командного интерпретатора (*, $, ?, [, ], <, >)
Слайд 8
Присваивание значений переменным
Значение переменным можно присвоить по команде присваивания:
ux=u.UNIX
ux=INIX
Здесь
первым оператором значение u.UNIX присваивается shell-переменной "ux", а вторым -
ее значение меняется на новое. Желательно команды писать строчными буквами, а переменные – всегда прописными.
Примечание: Перед знаком = и после не должно быть пробелов.
Слайд 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 без параметров.
Слайд 12
Использование переменных
При использовании значения переменной перед именем переменной должен
находиться символ $.
Этот символ информирует shell о том, что
следующее за ним имя относится к переменной, а не к файлу или к литералу.
Значения требуемых переменных можно вывести на экран по команде echo.
Слайд 13
Например, по команде
echo $ux
будет выведено INIX, так как
именно это значение было последним.
Переменная, которой не было явно присвоено
значение, содержит пустую строку.
Поэтому при выполнении команды
echo $abc
на экран ничего не будет выводиться.
Слайд 14
Если имя переменной заключить в фигурные скобки, то её
выведенное значение будет сопровождаться последовательностью символов, следующих за скобками.
Например,
по команде
echo ${ux}tm
будет напечатано UNIXtm.
Конструкция ${} используется, чтобы уточнить ссылку на переменную. Эта конструкция показывает, где заканчивается имя переменной и начинается текст, который следует добавить.
Слайд 15
Интерпретатор shell автоматически присваивает значения следующим пяти встроенным переменным:
$? -
значение, возвращаемое последней выполненной командой
(код возврата:
- равен 0
при успешном выполнении,
- при других неравен 0);
$$ - идентификационный номер процесса shell;
Слайд 16
#! - идентификационный номер фонового процесса, запускаемого интерпретатором shell;
$# - число
аргументов позиционных параметров, передаваемых в shell;
$* - список аргументов,
переданных в shell.
$- - флаги, передаваемые в shell при его запуске или установленной командой set.
Слайд 17
Эти переменные равнозначны переменным, создаваемым пользователем.
Например, по команде
echo $$
выведется идентификационный номер shell. Его можно проверить с
помощью команды ps.
Слайд 18
Использование shell-переменных в интерактивном режиме
shell-переменные можно использовать в интерактивном
режиме.
Предположим, что мы работаем с каталогом '/usr/src/my/doc/'.
Чтобы его
не писать во всех командах, это имя можно присвоить переменной
mydir=/usr/src/my/doc/
Слайд 19
После этого мы можем:
проверить корректность указанного имени по команде
echo $mydir
получить список файлов каталога по команде ls $mydir
вывести на экран
файл из этого каталога по команде cat $mydir/doc_unix.txt
выполнить программу myprog, хранящуюся в этом каталоге. Для этого присвоим полное имя новой переменной. Это можно сделать двумя способами:
Слайд 20
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
- текущий каталог.
Слайд 22
В строке поиска пути каталоги разделены двоеточиями, а для
указания текущего каталога служит пустое имя.
Это пустое имя может
быть задано или двумя следующими подряд двоеточиями или одним двоеточием в начале строки.
Необходимо отметить, что порядок поиска зависит от того, как каталоги расположены в строке поиска пути.
Так как строка поиска пути - это shell-переменная, то она может быть задана в интерактивном режиме.
Слайд 23
Например,
PATH = :/usr/bin:/bin:usr/mi/bin
Чтобы строки поиска пути инициализировались при запуске
shell, необходимо чтобы в Вашем начальном каталоге располагался файл по
имени ".profile" с этими строками.
Слайд 24
Отмена специального смысла символа
Существует три метода отмены специального смысла
символа:
Путем вставки обратной косой черты (\) перед символом;
Путем заключения всех
символов последовательности в одинарные кавычки (‘).
При этом теряют специальный смысл три знака:
- знак $ (доллара);
- знак ’ (кавычки);
- знак ” (двойных кавычек).
Слайд 25
Путем заключения всех символов
последовательности в двойные кавычки.
При этом
не теряют специальный смысл четыре знака:
- знак \ (обратная косая
черта);
- знак ` (знака ударения/апострофа);
- знак ' (кавычки);
- знак $ (доллара).
Слайд 26
Одинарные кавычки ‘’ указывают командному интерпретатору сохранить и не
интерпретировать текст внутри них (то есть спрятать любые спец символы
от командного процессора).
Двойные кавычки “” используются, чтобы сгруппировать вместе слова для формирования параметра или предложения. Но в них возможна интерпретация переменных.
Слайд 27
Пример:
Term=ansi
a) echo ‘Output $Term’
b) echo “Output $Term”
В первом случае
будет выведено
Output $Term
а во втором
Output ansi
Слайд 28
Апостроф ` наклонная одинарная кавычка (расположена на клавише, что
и тильда ~) применяется для замещения команды:
а) выполнить команду и
сохранить результаты в переменной;
б) выполнить команду и передать ее выходные данные другой команде.
Примеры:
А) echo `ls /bin/c*`
Командный процессор видит апострофы и выполняет команду ls, а затем помещает полученную информацию в команду echo.
Слайд 29
Результат может быть такой:
/bin/cat
/bin/cc
/bin/chmod
/bin/csh
Б) PWD=`pwd`
Сохранение имени текущего каталога в
переменной PWD. Поэтому при применении команды echo $PWD , будет
выведено имя каталога, где вы сейчас находитесь. Часто применятся следующий прием:
Слайд 30
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
Эти все три способа равноценны.
Слайд 33
Команда set
Команда set (установить) предназначена для вывода списка созданных
переменных.
Чаще всего в нем выводится, кроме Вами созданных переменных,
еще и следующие:
- TERM = vt100- тип терминала;
- PS1 = '$'- первичная подсказка, которую выводит интерпретатор shell, когда он готов принимать команду;
- PS2 = '>'- вторичная подсказка, которую выводит копия shell (то есть, вторично запущенный интерпретатор shell);
Слайд 34
- PATH = /bin::/usr/bin
- HOME = - имя Вашего
начального каталога;
- IFS = - внутренние разделители полей, которыми обычно
служат:
- пробел;
- табуляция;
- символы новой строки.
Слайд 35
Команда set имеет несколько опций, но Мы рассмотрим только
одну:
-v - все входные строки, читаемые shell, выводятся на экран.
+v
- подавление вывода на экран входных строк.
Слайд 36
Доступ к отдельным аргументам
Когда команда set применяется одновременно с
подстановкой результата выполнения команды, каждый из элементов вывода при подстановке
команды присваивается отдельному позиционному параметру.
Для задания подстановки результата выполнения команды в следующем примере команда date заключена в знаки апострофа ` (самая левая клавиша в цифровом ряде):
set `date`
Слайд 37
Выход команды date становится последовательностью аргументов для команды set
и поэтому на экране ничего не появится.
Если вызвать саму команду
date, то на экране можно будет увидеть:
date
Sun May 28 13:49:53 2011
Слайд 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
Слайд 39
Доступ к другим позиционным параметрам с номерами, больше девяти,
происходит по команде shift (сдвиг), которая сдвигает аргументы на одну
позицию влево:
($1 <= $2, $2 <= $3 и т.д.),
но имя команды в позиции $0 остается без изменения.
Интерпретатор shell воспринимает символ звездочки * как метасимвол для генерации номера любого позиционного параметра.
Слайд 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
Слайд 41
Простые условные операторы
Команда test | [ ]
Эта команда используется
совместно с командами while, until и if.
Они запускают команду
test и проверяют код возврата команды test.
Аргументы команды test образуют выражение, которое вычисляется при ее выполнении.
Если результат является true, то код возврата равен нулю, если false, то код возврата не равен нулю.
Слайд 42
Команда [ ] является другим именем команды test.
Её
синтаксис [выражение]
Эти две команды используют выражение, которое применяется для сравнения
либо текста, либо числа , либо атрибутов файлов или каталогов.
Это выражение может браться из переменных, констант и операторов. Операторы могут быть строковыми, булевыми или файлами.
Слайд 43
Команда test может использоваться для трех объектов:
- файлов,
-
числовых выражений,
- цепочек символов.
Проверка файлов
В этом случае общий вид команды
имеет вид:
test опция имя_файла
Слайд 44
Опции имеют вид:
-r - файл существует и его можно
прочитать;
-w - файл существует и в него можно записывать;
-x -
файл существует и может выполняться;
-f - файл существует и не является каталогом;
-d - файл существует и является каталогом;
-s - размер файла отличен от нуля.
Слайд 45
Сравнение числовых величин
В этом случае общий вид команды имеет
вид:
test А операция В
Операции имеют вид:
-eq - A = B
-ne - A ≠
B
-ge - A ≥ B
-gt - A > B
-le - A ≤ B
-lt - A < B
Слайд 46
Пример проверки целых чисел
test $int1 -eq $int2
или
[$int1 -eq $int2]
Слайд 47
Сравнение цепочек символов
test -n существование цепочки символов
test -z отсутствие
цепочки символов
test =
равенство двух цепочек символов
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.
Слайд 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.
Слайд 51
Команды && и II позволяют контролировать выполнение.
&& означает, что
следующая за ней команда будет выполнена в том случае, если
предшествующая дала true, то есть код возврата, равным 0;
II означает, что команда, стоявшая после II, выполняется, если первая даст код возврата не 0 (false).
Условный оператор
Операторы && и II могут дать только простые условные структуры.
К более сложным операторам относится оператор if.
Оператор if в простом виде имеет следующий формат:
Слайд 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
Слайд 53
Здесь elif выполняется, если if_list не равен нулю,
и состоит в следующем:
if elif_list then then_list_2 else else_list fi
В группе
может находиться только один блок if и один блок else, а количество elif может быть различным.
Слайд 54
Ветвление по
нескольким направлениям case
Её лучше применять в случае
большого числа if и else.
Данная структура предназначена для выполнения
ветвления по нескольким направлениям на основе совпадения образов.
Слайд 55
Ее общая форма такова:
case in
s1) ;;
s2) ;;
………………………….
sn)
;;
esac
Слайд 56
Команда case сравнивает шаблон string с каждым шаблоном s1,s2...
sn.
Если фиксируется совпадение, то будет выполняться список команд, который
следует за совпавшим со string шаблоном.
Синтаксис команды требует двойных точек с запятой (;;) в конце каждого списка и оператора esac в конце всей команды case.
Слайд 57
Одному списку команд может соответствовать несколько текстовых образцов, разделенных
вертикальной чертой, указывающий на дизъюнкцию.
s1|s2|s3)
Обычный смысл вертикальной черты как
конвейера в операторе case подавляется.
Последний шаблон желательно *), так как * соответствует любой последовательности.
Шаблон может содержать метасимволы shell
(* ? {…} […])
Слайд 58
Пример:
case “$1” in
[1-9]) Number=True;;
A|a) dev=A;;
B|b dev=B;;
/dev/* dev=$1;;
esac
Здесь, если $1 отличное от нуля
число, то выполняется первый пункт. Если это буква a и
A, то выполняется второй пункт.
Слайд 59
Построение циклов
Цикл тип while
Синтаксис такого оператора следуюший:
while while_list do
do_list done
Вначале проверяется условие, а потом выполняется тело цикла.
Цикл типа
until
Синтаксис такого оператора следуюший:
until until_list do do_list done
Здесь цикл выполняется, пока until_list не равно 0 (то есть, пока until_list имеет значение false).
Слайд 60
Цикл типа for
А) for с in
for name in for_list
do do_list
done
Переменной name присваивается
в качестве значения текущее слово списка.
Список операторов do_list выполняется один
раз для каждого слова из списка for_list.
Слайд 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
Слайд 62
Б) for без in
Структура for может применяться и без ключевого слова
in.
for name
do do_list
done
В этом случае do_list выполняется один раз для
каждого позиционного параметра (аргумента) интерпретатора shell. Команда for name эквивалентна команде
for name in $*.
Слайд 63
Например, необходимо инвертировать порядок списка аргументов.
Для этого необходимо
выполнить:
list = ''
for arg
do list = "$arg $list"
done
echo $list
Если интерпретатор
shell запускался с параметрами 1 2 3 4 5, то будет выдано
5 4 3 2 1.
Слайд 64
Кроме аргументов командной строки и позиционных параметров, могут обрабатываться
файлы, используя знаки подстановки:
for file in *
do echo “found $file”
done
В
этом примере выводится список файлов, находящихся в данном каталоге, по одному названию файла в строке.
for file in [ab]* ….
for file in a?? ….
Слайд 65
Пустая строка
: - это команда обозначает отсутствие операции. Её
нельзя использовать в качестве комментария.
# - оператор комментария (игнорирует выполнение);
: - ничего
не делает.
if [ ! $1]
then : # Нет ничего
fi
Слайд 66
Данный пример показывает, что 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
Слайд 68
Если переменная level отсутствует или равна 1, то прерывается
цикл 1.
Если level=2, то прерывается цикл 2,
и если
level=3, то прерывается цикл 3.
Прерывание итерации
цикла continue
Эта команда приводит к прерыванию выполнения итерации ближайшего цикла, в котором находится сама команда continue.
Слайд 69
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, то будет продолжаться выполнение самого внутреннего цикла.
Слайд 71
Фоновое выполнение цикла
Если после done подставить &, то цикл
будет выполняться в фоновом режиме.
for var in 1 2 3
4 5
do echo “$var”
done &
это может быть применено и для циклов while и until.
Слайд 72
Выход из программы exit
Эта команда прекращает не просто текущий
цикл, а всей процедуры.
После выполнения команды exit в вызывающую
программу передается код возврата, равный нулю (true).
Если команда имеет аргумент, например, exit $status, то возвращается код возврата, равный значению переменной status.
Слайд 73
Переназначение ввода/вывода и циклы
Переназначение ввода
for var in *
do
команды
done
источник
Все команды в цикле получают данные через стандартный ввод. Можно
получить из перенаправленного источника (любая команда считывает данные из указанного источника).
Слайд 74
for var in *
do
команды < источники
done
Здесь каждая команда может
брать входные данные с разных мест.
Переназначение вывода
Аналогично можно переназначить вывод:
for
var in 1 2 3 4 5
do
echo “$var”
done
Слайд 75
Здесь все выходные данные всех команд в цикле направляются
в единый файл (стандартный вывод).
for var in 1 2 3
4 5
do
echo “Processing $var” > /dev/tty
команды
done > output
Здесь по команде echo данные направлены на tty, а по всем другим командам - в единый файл (стандартный вывод).
Слайд 76
Можно связать циклы и конвейеры:
ls | for file in
*
do
echo $file
file $file
done
Это пример перекачки данных в цикл из конвейера.
Команда file определяет тип файла.
Слайд 77
for file in *
do
echo $file
done | wc –l
Здесь передача
информации в конвейер в конце цикла. Происходит печать имен файлов
и посылка по конвейеру команде wc –l для подсчета количества файлов.
Слайд 78
Подстановка результатов
выполнения команд
shell дает возможность использования стандартного вывода
любой команды в shell-программе.
Если команда заключена в знаки ударения
(апострофы), то shell выполняет эту команду и подставляет вместо нее полученный результат.
Слайд 79
Пример 1.
now = 'date'
В результате действия переменной now будет
присвоена текущая дата:
now = Wed Feb 12 11:49:23 1997
Теперь по
команде
echo $now
на экран будет выведена дата, хранящаяся в now.
Слайд 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
Слайд 81
Пример 3.
curr = 'pwd' Получение текущего каталога
cd /usr/bin/Mi/doc Переход в другой
каталог
................. Действия в этом каталоге
cd $curr Возврат в текущий каталог, то есть
не надо было его помнить!
Слайд 82
Вычисление выражений expr
Для выполнения арифметических операций в командном процессоре
Борна (в Корне и С – это встроено). Результат передается
на стандартный ввод.
Рассмотрим пример работы Борна:
a=1
b=$a + 1 (все аргументы отделяются пробелами)
echo $b
Будет выдано: $a + 1
Слайд 83
То есть он текст “+1” конкатенирует с переменной a,
так как все цифры в Борне – это символы.
Вычисление арифметических
выражений
Команда expr рассматривает свои аргументы как выражения (арифметические или логические).
Результат вычисления передается на стандартный вывод.
Слайд 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 будет выданы ошибки.
Слайд 86
Сравнение цепочки символов
Эта команда может использоваться для сравнения цепочек.
Команда expr с помощью операции двоеточия (:) позволяет сравнивать цепочки
символов.
Результатом выполнения такой команды является число совпадающих символов в обеих цепочках.
Если результат равен нулю, то совпадение отсутствует.
Слайд 87
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
Слайд 89
Такое сопоставление можно выполнить и с использованием переменных
M =
‘abcdef’
N = ‘abcd’
C = `expr $M : $N`
Применяя эту команду,
можно определить длину цепочки:
A = "This is an experement" Присваивание цепочки символов переменной A. Так как в ней есть пробелы, то ее заключаем в двойные кавычки.
Слайд 90
count = `expr $A : ‘.*’`
Второй операнд .* говорит
о том, что символ (.) может повторяться сколько угодно раз,
а сам символ (.) означает любой символ.
Чтобы указать интерпретатору shell на специальный смысл символов (.) и (*), второй аргумент заключен в апострофы
echo $count
21
Слайд 91
Другой возможностью команды expr является ее способность выделить только
часть цепочки символов с помощью конструкции \(...\). Эти круглые скобки
– скобки регулярного выражения, которые используются для запоминания результата.
B = `expr $A : ‘….. \(.*\)’`
Здесь пять точек перед знаком \ соответствует пяти символам, которые следует пропустить ( включая пробел ) с начала цепочки символов.
echo $B
Результат операции:
is an experement
Слайд 92
Условная замена переменных
При условной замене значение одной переменной подставляется
вместо значения другой.
Интерпретатор shell реализует четыре варианта условно замены
с помощью 4-х символов: -, =, ?, +:
A. {VARIABLE - OTHER}
Если переменной VARIABLE было присвоено значение, то используется оно. В противном случае используется цепочка символов OTHER, а переменная VARIABLE не меняется.
Слайд 93
B. {VARIABLE = OTHER}
Если переменной VARIABLE было присвоено значение, то
используется оно.
В противном случае перед использованием переменной VARIABLE ей
присваивается значение переменной OTHER.
C. {VARIABLE ? EMPTY}
Если переменной VARIABLE было присвоено значение, то используется оно.
В противном случае на экран выводится сообщение VARIABLE : EMPTY, а процедура прекращается.
Слайд 94
При отсутствии аргумента справа от знака ? выдается стандартное
сообщение системы: VARIABLE : parametr not set
D. {VARIABLE + OTHER}
Если переменной
VARIABLE было присвоено значение, то используется значение переменной OTHER.
Если же значение переменной VARIABLE не присвоено, то в качестве ее значение используется пустая цепочка символов и при этом переменной VARIABLE значение не присваивается.
Слайд 95
Примеры.
Пусть во всех примерах переменные
VAL и VAR не
определены.
A1. echo ${VAL - 123}
123
A2. SUB = 456
echo ${VAL - $SUB}
456
B. echo ${VAL
= xyz}
xyz
echo $VAL
xyz
Слайд 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
Слайд 97
Усложненное
присваивание переменным
В операторах присваивания можно присваивать значения нескольким
переменным.
Пример 1.
a = T b = H c = I d =
S
echo $a$b$c$d
THIS
Слайд 98
Пример 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
(В строках с двойными кавычками происходит интерполяция переменных)
Слайд 100
Пример 4. Значение, присваемое переменной, может быть значением другой переменной.
A
= символ1
В этом примере дополнительные символы приписываются слева
B = мета$A
(то есть, с начала)
echo $B
На экран будет выведено: метасимвол1
Слайд 101
Для приписывания дополнительных символов к концу имени необходимо ставить
фигурные скобки.
B = мета
echo ${B}символ2
На экран будет выведено: метасимвол2
иначе будет
выведено сообщение, что переменная $Bсимвол2 отсутствует.
Слайд 102
Позиционные параметры
Для идентификации позиций элементов в командной строке shell
устанавливает позиционные параметры.
Чтобы интерпретатор мог их различать друг от
друга, они должны разделяться пробелами.
При этом интерпретатор нумерует их, начиная с нуля.
Первый элемент (имя команды) всегда обозначается $0, первый аргумент - $1, второй - $2 и так далее до $9.
Слайд 103
shell использует 10 позиционных параметров и несколько специальных переменных
для работы с аргументами, которые вводятся либо через командную строку
либо устанавливаются пользователем.
Пример.
grep cat enter
$0 $1 $2
shell не может одновременно обрабатывать более 10 параметров (то есть за один раз).
Слайд 104
Для этой цели применяется цикл и команда shift, чтобы
перенести позиционные параметры влево, но имя команды остается без изменения
в позиции $0.
shift
После этого:
$2 => $1
$3 => $2
$4 => $3 и так далее.
Слайд 105
Присваивание значений
позиционным параметрам
Для этого применяется команда set.
Она
присваивает позиционному параметру значения цепочки символов аргументов.
set arg1 arg2 arg3
Слайд 106
По этой команде интерпретатор shell присваивает первому позиционному параметру
$1 значение arg1, второму - arg2 и т.д.
Значения этих
аргументов можно проверить, выведя их значения на экран:
echo $1 $2 $3
Будет выведено arg1 arg2 arg3
Слайд 107
Пример:
set `date`
Выход команды date становится последовательностью аргументов для команды
set и на экране ничего не отобразится.
Будет сформировано:
$1 - день
недели;
$2 - название месяца;
$3 - день месяца;
$4 - дата;
$5 - год.
Слайд 108
Дополнительные переменные
командной строки.
$# - число аргументов в командной строке;
$* - все аргументы
до последнего, то есть и $11, $12 и так далее;
$@- все
аргументы в командной строке после того, как кавычки поставлены около каждого из них.
shift
echo $1 $2 … $9
arg2 arg3 ….arg10
Слайд 110
Отладка shell-программ
Для установки контроля над shell-программой при вызове команды
sh надо добавить одну из двух следующих опций:
-x - опция трассировки.
Эта
опция необходима для просмотра команд и аргументов по мере их выполнения.
-v - опция входного контроля. Производит отображение входных строк по мере их считывания.
Слайд 111
Например, для отладки shell-процедуры filez надо ввести:
sh -x filez
Можно объединять опции
в одну:
sh -xv filez