Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Манипуляции с 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; Просмотров: 167; Нарушение авторского права страницы