- •Лабораторная работа № 5 «Программирование в командном процессоре ос unix»
- •5.1 Командные процессоры (оболочки)
- •5.2 Переменные в языке программирования bash
- •Использование арифметических вычислений. Операторы let и read
- •Арифметические операторы оболочки bash
- •5.3 Метасимволы и их экранирование
- •5.4 Командные файлы и функции
- •5.4.1 Передача параметров в командные файлы и специальные переменные
- •5.4.3 Управление последовательностью действий в командных файлах
- •5.4.2 Использование команды getopts
- •5.5 Оператор цикла for
- •5.6 Оператор выбора case
- •5.7 Условный оператор if
- •5.8 Операторы цикла while и until
- •5.9 Прерывание циклов
- •Задание на лабораторную работу
- •Контрольные вопросы
Использование арифметических вычислений. Операторы let и read
Оболочка bash поддерживает встроенные арифметические функции. Команда let является показателем того, что последующие аргументы представляют собой выражение, это единичный терм (term), обычно подлежащее вычислению. Простейшее выражение целочисленный.
Целые числа можно записывать как последовательность цифр или в любом базовом формате. Этот формат – radix#number, где radix (основание системы счисления) любое число не более 26. Для большинства команд основания систем счисления это – 2 (двоичная), 8 (восьмеричная) и 16 (шестнадцатеричная). Простейшими математическими выражениями являются сложение (+), вычитание (-), умножение (*), целочисленное деление (/) и целочисленный остаток (%). Команда let берет два операнда и присваивает их переменной.
Положительным моментом команды let можно считать то, что для идентификации переменной ей не нужен знак доллара; вы можете писать команды типа let sum=x+7, и let ищет переменную x и добавляет к ней 7. Команда let также расширяет другие выражения let, если они заключены в двойные круглые скобки. Таким способом вы можете создавать довольно сложные выражения. Команда let не ограничена простыми арифметическими выражениями. Табл.1 показывает полный набор let операций.
Таблица 1.
Арифметические операторы оболочки bash
Оператор |
Синтаксис |
Результат |
! |
!ехр |
Если ехр равно 0, возвращает 1; иначе 0 |
!= |
ехр1 !=ехр2 |
Если ехр1 не равно ехр2, возвращает 1; иначе 0 |
% |
ехр1%ехр2 |
Возвращает остаток от деления ехр1 на ехр2 |
%= |
var=%exp |
Присваивает остаток от деления var на ехр переменной var |
& |
ехр1&ехр2 |
Возвращает побитовое AND выражений ехр1 и ехр2 |
&& |
ехр1&&ехр2 |
Если и ехр1 и ехр2 не равны нулю, возвращает 1; иначе 0 |
&= |
var &= ехр |
Присваивает var побитовое AND переменных var и выражения ехр |
* |
ехр1 * ехр2 |
Умножает ехр1 на ехр2 |
*= |
var *= ехр |
Умножает ехр на значение var и присваивает результат переменной var |
+ |
ехр1 + ехр2 |
Складывает ехр1 и ехр2 |
+= |
var += ехр |
Складывает ехр со значением var и результат присваивает var |
- |
-exp |
Операция отрицания exp (называется унарный минус) |
- |
expl - exp2 |
Вычитает exp2 из exp1 |
-= |
var -= exp |
Вычитает exp из значения var и присваивает результат var |
/ |
exp / exp2 |
Делит exp1 на exp2 |
/= |
var /= exp |
Делит var на exp и присваивает результат var |
< |
expl < exp2 |
Если exp1 меньше, чем exp2, возвращает 1, иначе возвращает 0 |
<< |
exp1<< exp2 |
Сдвигает exp1 влево на exp2 бит |
<<= |
var <<= exp |
Побитовый сдвиг влево значения var на exp |
<= |
expl <= exp2 |
Если exp1 меньше, или равно exp2, возвращает 1; иначе возвращает 0 |
= |
var = exp |
Присваивает значение exp переменной var |
= = |
exp1= =exp2 |
Если exp1 равно exp2. Возвращает 1; иначе возвращает 0 |
> |
exp1> exp2 |
1 если exp1 больше, чем exp2; иначе 0 |
>= |
exp1 >= exp2 |
1 если exp1 больше, или равно exp2; иначе 0 |
>> |
exp >> exp2 |
Сдвигает exp1 вправо на exp2 бит |
>>= |
var >>=exp |
Побитовый сдвиг вправо значения var на exp |
^ |
exp1 ^ exp2 |
ИсключающееOR выражений exp1 и exp2 |
^= |
var ^= exp |
Присваивает var побитовое исключающее OR var и exp |
| |
exp1 | exp2 |
Побитовое OR выражений exp1 и exp2 |
|= |
var |= exp |
Присваивает var «исключающее OR» переменой var и выражения exp |
|| |
exp1 || exp2 |
1 если или exp1 или exp2 являются ненулевыми значениями; иначе 0 |
~ |
~exp |
Побитовое дополнение до exp |
Кроме использования команды let в целях присваивания, let также выполняет обработку условий. Подобно С оболочка bash может присваивать переменной любое значение, а произвольное выражение само имеет значение, которое может использоваться. При этом «ноль» воспринимается как «ложь», а любое другое значение выражения – «истина». Для облегчения программирования можно записывать условия оболочки bash, в двойные скобки – (( )).
Конечно же, можно присваивать результаты условных выражений переменным, как и использовать результаты арифметических вычислений в качестве условий. Хорошим примером было бы выполнять некоторое действие, одновременно декрементируя некоторое значение. Далее следует иллюстрация сказанного:
$let х=5
$while
> (( x-=1 ))
>do
>something
>done
$
Этот пример показывает выполнение с начальным значением 5 и декрементирует его до тех пор, пока оно не будет равно нулю. При каждой итерации выполняется функция something.
Наиболее распространенным является сокращение, избавляющееся от слова let в программах оболочек. Если объявить переменные целыми значениями, любое присвоение автоматически трактуется как арифметическое. Используйте typeset -1 для объявления и присвоения переменной, и при последующем использовании она становится целой. Или можете использовать ключевое слово integer (псевдоним для typeset -l) и объявлять переменные целыми. Таким образом, выражения типа х=y+z воспринимаются как арифметические.
Команда read позволяет читать значение переменных со стандартного ввода:
echo “Please enter Month and Day of Birth ?”
read mon day trash
В переменные mon и day будут считаны соответствующие значения, введенные с клавиатуры, а переменная trash нужна для того, чтобы отобрать всю избыточно введенную информацию и игнорировать ее. Изъять переменную из программы можно с помощью команды unset.
Имена некоторых переменных имеют для командного процессора специальный смысл. Значением переменной PATH (т.е. $РАТН) является список каталогов, в которых командный процессор осуществляет поиск программы или команды, указанной в командной строке, в том случае, если указанное имя программы или команды не содержит ни одного символа /. Если имя команды содержит хотя бы один символ /, то последовательность поиска, предписываемая значением переменной PATH, нарушается. В этом случае в зависимости от того, является имя команды абсолютным или относительным, поиск начинается соответственно от корневого или текущего каталога.
Если Вы сами явно не присвоите переменной PATH какого-либо значения, то стандартной (по умолчанию) последовательностью поиска файла является следующая: текущий каталог, каталог /bin, каталог /usr/bin. Именно в такой последовательности командный процессор отыскивает файлы, содержащие программы, которые обеспечивают выполнение таких, например, команд, как echo, lscat. В списке каталогов, являющемся значением переменной PATH, имена каталогов отделяются друг от друга с помощью символа двоеточия. В качестве примера приведем команду: PATH =:/usr/andy/bin:/usr/mike/bin:/bin:/usr/bin.
Переменные PS1 и PS2 предназначены для отображения промптера командного процессора. PS1 – это промптер командного процессора, по умолчанию его значение равно символу $ или #. Если какая-то интерактивная программа, запущенная командным процессором, требует ввода, то используется промптер PS2. Он по умолчанию имеет значение символа >.
Другие стандартные переменные:
HOME – имя домашнего каталога пользователя. Если команда cd вводится без аргументов, то происходит переход в каталог, указанный в этой переменной.
IFS – последовательность символов, являющихся разделителями в командной строке. Это символы пробел, табуляция и перевод строки(new line).
MAIL – командный процессор каждый раз перед выводом на экран промптера проверяет содержимое файла, имя которого указано в этой переменной, и если содержимое этого файла изменилось с момента последнего ввода из него, то перед тем как вывести на терминал промптер, командный процессор выводит на терминал сообщение You have mail (у Вас есть почта).
TERM – тип используемого терминала.
LOGNAME – содержит регистрационное имя пользователя, которое устанавливается автоматически при входе в систему.
В командном процессоре Си имеется еще несколько стандартных переменных. Значение всех переменных можно просмотреть с помощью команды set.
