Манипуляции с shell-переменными




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

Разнообразные возможности имеет команда "expr". Проиллюстрируем некоторые на примерах:

Практическая (лабораторная) работа:

4. Выполните следующие присваивания переменных x,y,a,b,c,d,e. Выведите значения этих переменных с перенаправлением вывода в файл protocol.txt.

x=7 y=2

a=`expr $x + $y`; echo a=$a

a=`expr $a + 1`; echo a=$a

b=`expr $y - $x`; echo b=$b

c=`expr $x '*' $y`; echo c=$c

d=`expr $x / $y`; echo d=$d

e=`expr $x % $y`; echo e=$e

Результат должен быть следующим:

a=9

a=10

b=-5

c=14

d=3

e=1

Операция умножения ("*") обязательно должна быть заэкранирована, поскольку в shell этот значок воспринимается, как спецсимвол, означающий, что на это место может быть подставлена любая последовательность символов.

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

С командой "expr" возможны не только (целочисленные) арифметические операции, но и строковые:

A=`expr 'cocktail': 'cock'`; echo $A

B=`expr 'cocktail': 'tail'`; echo $B

C=`expr 'cocktail': 'cook'`; echo $C

D=`expr 'cock': 'cocktail'`; echo $D

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

И наконец, об условной замене переменных.

Если переменные, скажем "х", "y", "z", не определены, то при обращении к переменным

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

А в следующем случае наоборот, пусть переменная "v" имеет какое-то значение, тогда

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

Как во всяком языке программирования в тексте на языке shell могут быть комментарии. Для этого используется символ "#". Все, что находится в строке (в командном файле) левее этого символа, воспринимается интерпретатором как комментарий.

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

4.1. Команда test ("[ ]")

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

Два возможных формата команды:

Test условие

Или

[ условие ]

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

На самом деле shell будет распознавать эту команду по открывающей скобке "[", как слову(!), соответствующему команде "test". Уже этого достаточно, чтобы предупредить о распространенной ошибке начинающих: Между скобками и содержащимся в них условием обязательно должны быть пробелы.

Пробелы должны быть и между значениями и символом сравнения или операции (как, кстати, и в команде "expr"). Не путать с противоположным требованием для присваивания значений переменным.

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

УСЛОВИЯ ПРОВЕРКИ ФАЙЛОВ:

Практическая (лабораторная) работа:

5.Вводя с клавиатуры командные строки в первом случае получим подтверждение (код завершения "0"), а во втором - опровержение (код завершения "1"). "specific" - имя существующего файла. Вывод результата, по-прежнему, перенаправляем в файл protocol.txt.

[ -f protocol.txt ]; echo $? >>protocol.txt

[ -d protocol.txt ]; echo $? >>protocol.txt

УСЛОВИЯ ПРОВЕРКИ СТРОК:

Примеры.

x="who is who"; export x; [ "who is who" = "$x" ]; echo $?

x=abc; export x; [ abc = "$x" ]; echo $?

x=abc; export x; [ -n "$x" ]; echo $?

x=""; export x; [ -n "$x" ]; echo $?

Команда "test" дает значение "истина" (т.е. код завершения "0") и просто если в скобках стоит непустое слово.

[ privet ]; echo $?

[ ]; echo $?

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

true; echo $?

false; echo $?

УСЛОВИЯ СРАВНЕНИЯ ЦЕЛЫХ ЧИСЕЛ:

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

Примеры.

x=abc; export x; [ abc -eq "$x" ]; echo $?

"[": integer expression expected before -eq

x=321; export x; [ 321 -eq "$x" ]; echo $?

x=3.21; export x; [ 3.21 -eq "$x" ]; echo $?

"[": integer expression expected before -eq

x=321; export x; [ 123 -lt "$x" ]; echo $?

СЛОЖНЫЕ УСЛОВИЯ:

Реализуются с помощью типовых логических операций:

ПРЕДУПРЕЖДЕНИЕ. Не забывайте о пробелах.

Примеры.

[! privet ]; echo $?

x=privet; export x; [ "$x" -a -f specific ]; echo $?

x="";export x; [ "$x" -a -f specific ]; echo $?

x="";export x; [ "$x" -a -f specific -o privet ]; echo $?

x="";export x; [ "$x" -a -f specific -o! privet ]; echo $?

Не злоупотребляйте сложными условиями.

4.2. Условный оператор "if"

В общем случае оператор "if" имеет структуру

If условие

Then список

[elif условие

then список]

[else список]

fi

Здесь "elif" сокращенный вариант от "else if" может быть использован наряду с полным, т.е. допускается вложение произвольного числа операторов "if" (как и других операторов). Разумеется "список" в каждом случае должен быть осмысленный и допустимый в данном контексте.

Конструкции

[elif условие

then список]

и

[else список]

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

Самая усеченная структура этого оператора

If условие

Then список

fi

если выполнено условие (как правило это ком получен код завершения "0", то выполняется "список", иначе он пропускается.

Обратите внимание, что структура обязательно завершается служебным словом "fi". Число "fi", естественно, всегда должно соответствовать числу "if".

Практическая (лабораторная) работа:

6. Реализуйте пример на вложенность.

###

# if-2: Оценка достижений

echo -n " А какую оценку получил на экзамене?: "

Read z

if [ $z = 5 ]

then echo Молодец!

elif [ $z = 4 ]

then echo Все равно молодец!

elif [ $z = 3 ]

then echo Все равно!

elif [ $z = 2 ]

then echo Все!

else echo!

fi

Вывод результата перенаправьте в файл protocol.txt.

4.3.Оператор вызова ("case") Оператор выбора "case" имеет структуру:

Case строка in

шаблон) список команд;;

шаблон) список команд;;

...

Esac

Здесь "case" "in" и "esac" - служебные слова. "Строка" (это может быть и один символ) сравнивается с "шаблоном". Затем выполняется "список команд" выбранной строки. Служебное слово "esac" необходимо для завершения структуры.

Практическая (лабораторная) работа:

7. Реализуйте следующие действия:

cho -n " А какую оценку получил на экзамене?: "

Read z

case $z in

5) echo Молодец!;;

4) echo Все равно молодец!;;

3) echo Все равно!;;

2) echo Все!;;

*) echo!;;

Esac

Непривычно выглядят в конце строк выбора ";;", но написать здесь ";" было бы ошибкой. Для каждой альтернативы может быть выполнено несколько команд. Если эти команды будут записаны в одну строку, то символ ";" будет использоваться как разделитель команд.

Обычно последняя строка выбора имеет шаблон "*", что в структуре "case" означает "любое значение". Эта строка выбирается, если не произошло совпадение значения переменной (здесь $z) ни с одним из ранее записанных шаблонов, ограниченных скобкой ")". Значения просматриваются в порядке записи.

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-04-04 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: