Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Манипуляции с 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

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

4

0

0

0

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

Если переменные, скажем " х", " 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

0

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

1

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

Примеры.

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

0

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

0

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

0

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

1

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

[ privet ]; echo $?

0

[ ]; echo $?

1

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

true; echo $?

0

false; echo $?

1

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

То есть в данном случае команда " 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 $?

0

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

" [": integer expression expected before -eq

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

0

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

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

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

Примеры.

[! privet ]; echo $?

1

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

0

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

1

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

0

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

1

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

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) ни с одним из ранее записанных шаблонов, ограниченных скобкой " )". Значения просматриваются в порядке записи.


Поделиться:



Последнее изменение этой страницы: 2019-03-30; Просмотров: 139; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.032 с.)
Главная | Случайная страница | Обратная связь