Колисниченко Д.Н. - Linux-сервер своими руками (1077324), страница 101
Текст из файла (страница 101)
Например, когда выприсваиваете переменной значение VAR=13, то это будет не числовое значение, а строка из двух символов. Если присваиваемое значение имеет пробелы, его нужно взять в кавычки:VAR="value 1"Присвоить значение переменной можно с помощью встроенной команды read:echo -n "Enter value: "read xecho $xПараметр -п команды echo не выводит символ новой строки в концесообщения «Enter value:», то есть не переводит строку.
Команда read читаетзначение, введенное пользователем с клавиатуры, и записывает его в переменную х. Последняя команда выводит только что введенное значение. Прииспользовании команды read можно указывать несколько переменных:read a b сПользователь должен ввести значения переменных, разделяя их пробелами. Для окончания ввода нужно нажать «Enter». Если введено меньшезначений, чем нужно, оставшимся переменным будет присвоена пустаястрока. А если больше, то лишние значения будут проигнорированы.Интерпретатор bash использует следующие метасимволы, имеющие длянего особое значение:* ? ; & ( ) | Л < > <возврат_каретки> <табуляция> <пробел>Для того, чтобы использовать эти символы как они есть, нужно ихцитировать с помощью символа \. Например, символ перевода строки можно цитировать как \п, символ табуляции как \t, а символ вопроса как \?Особое значение при присваивании переменным значений имеют кавычки.
Все символы, заключенные в одинарные кавычки ' ' представляютсамих себя. Между двойными кавычками " " выполняются команды иподстановки значений. Символы "\", ",", " ' ", " $ " могут цитироваться спомощью обратной наклонной черты: \\, \$, \'Для обозначения параметров командной строки используются специальные переменные, указанные в табл. 19.36.438Полезные команды и программы. Создание ПРМ-пакетовСпециальные переменныеНазваниепеременнойТаблица 19.36Значение$0Имя выполняемой команды.
Для сценария — путь, указанный при его вызове. Если вызнакомы с языком программирования Pascal, эта переменная должна вам напоминатьвызов функции ParamStr(O)$п (где п - номерпараметра, $1,$2, ...)Обращение к параметру с номеров п. Для Pascal — это вызов функции ParamStr(n)$#Число параметров, которые были указаны при вызове сценария. Аналогична вызовуфункции ParamCount в Pascal$'$@Все параметры, заключенные в кавычки: "$1 $2 ..."$?Код завершения последней команды$$Номер текущего процесса (PID)Номер (PID) последнего асинхронного процесса (команды, выполненной в фоновомрежиме)$!Все параметры, каждый из которых заключен в кавычки "$1" "$2" ...Пример.echo "Все параметры: "echo $*Интерпретатор bash поддерживает одномерные массивы с неограниченным числом элементов.
В других оболочках существуют определенные ограничения на массивы, например, в ksh максимальное число элементов массива ограничено 1024-мя элементами.Присвоить значение элементу массива можно с помощью такой конструкции:Имя_массива[индекс]=значениеНапример:А[1]=23А[3]=54А[0]=77Нумерация элементов начинается с ноля. Тип элементов массива, как итип переменных, текстовый. Присвоить значение элементам массива можнотакже с помощью инструкции set.
Например, выражение:set -A a r r a y 3 56 77 12аналогично выражениям:array[0]=3array[1]=56array[2]=77array[3]=12Вышеприведенные способы инициализации массивов могут применятьсякак в bash, так и в ksh, а также и в других оболочках. Но, тем не менее,•существует еще один способ, который работает только в bash:array = ( [ 0 ] = 3 [3]=12 [2]=77 [1]=5б)Обратиться к значению элемента можно следующим образом:${имя_массива[индекс]}439Полезные команды и программы. Создание ПРМ-пакетовНапример, вывести значение первого (нулевого) элемента массива можно так:echo { $ a r r a y [ 0 ] }Обратиться ко всем элементам массива сразу можно с помощью одногоиз выражений:${имя_массива[*]} или ${имя_массива[@]}Если значение хотя бы одного элемента массива может содержать пробелы, используйте второе выражение:echo $ { a r r a y [ @ ] }Особое значение имеют переменные окружения.
У каждого процессаесть своя среда — множество доступных ему переменных. Обыкновенныепеременные доступны только из локального процесса. Чтобы использоватьих значения в порождаемых процессах, нужно использовать встроеннуюкоманду export. После того, как вы экспортируете переменные, они будутдоступны всем порожденным процессам.Выражение export:export имяexport имя=значениеexport имя имя имя . . .export имя=значение имя имя=значение . . .Как видите, можно экспортировать уже инициализированную переменную (которой уже присвоено значение), а можно выполнить инициализациюпеременной непосредственно при экспорте.
Экспортировать можно как однупеременную, так и целый список.Для деактивизации переменной используется команда unset:unset имяКаждому процессу доступны переменные оболочки, приведенные в табл. 19.37.Таблица 19.37Переменные оболочкиНазваниепеременнойPWDUIDREPLYRANDOMSECONDSIPS (Internal FiledSeparator)HOMEPATHLOGNAMEMAILSHELLTERMЗначениеТекущий каталогИдентификатор пользователя, запустившего сценарийПоследняя строка, введенная с помощью команды readСлучайное число в диапазоне от 0 до 32767Число секунд, прошедшее с момента запуска оболочкиВнутренний разделитель полей. Используется синтаксическим анализатором и командой read для разделения строчки на слова.
По умолчанию его значение равно " \t\n",где: « » — пробел;«\t» — символ табуляции;,<\п» — символ новой строкиДомашний каталогПуть вызоваИмя пользователя, которое использовалось для входа в системуИмя файла, в который поступает электронная почтаИмя интерпретатора командТип терминала пользователяПример.echo "$НОМЕ"440Полезные команды и программы. Создание РРМ-пакетов19.7.5. Подстановка команд и арифметических выраженийВ гл. 13 (п. 13.5) мы уже сталкивались с подстановкой команд.
Тогдапеременной DT присваивался результат выполнения команды date:xDT=MateКак я уже писал, при подстановке команд нужно использовать обратныеодинарные кавычки (они расположены под символом тильды на клавиатуре). Подставлять можно не только одну команду, а целые списки команд:xЛUSERS= who I wd -1ЛUP='date; uptimeВ первом случае мы получим количество пользователей работающих всистеме, а во втором — последовательно записанные результаты выполнениякоманд date и uptime.Подставлять результаты выполнения можно не только в переменные, а ив другие команды, например:grep 'id -un' / e t c / p a s s w dДанная команда ищет в файле /etc/passwd вхождение результатавыполнения команды id -unПодстановка арифметических выражений осуществляется с помощьюконструкции$ ( ( выражение > )Например:А = $((e.cho $A(10+51/2 ))При этом на экране вы увидите число 7, а не 7.5, потому что используется целочисленное вычисление.
Пример. Количество часов, прошедшее смомента запуска оболочки:hrs = $ ( ( $SECONDS/3600 ) )19.7.6. Управляющие структуры и циклыК управляющим структурам относятся:» Конструкция if-fi.» Конструкция case-esac.Конструкцияif-fiОбщий синтаксис конструкции if-fi:ifсписок! thenсписок2e l i f списокЗ thenсписок4elseсписокЗfiКонструкция if-fi работает так же, как и в других языках программирования.
Если список! (условие) истинный, выполняется список!, иначе выпол441Полезные команды и программы. Создание RPM-пакетовняется списокЗ и проверяется его истинность и т.д. Допускается неограниченная вложенность операторов if. Например:if uuencode m y f i l e m y f i l e > m y f i l e . u u ; thenecho "Успешное конвертирование";elseecho "Ошибка";fiМожно использовать сокращенный вариант:if список! thenсписок2fiНапример:if [ $? -ne 0 ]; then echo "Ошибка. См. файл протокола"; fi;Вместо списка команд удобно использовать команду test или выражение[условие]. Например, следующие выражения аналогичны:test -e /etc.passwd[-е /etc/passwd]И первое, и второе выражение проверяют существование файла/etc/passwd.
Другие опции команды test представлены в табл. 19.38.Опции команды testОпция-d файл-е файл-f файл-k файл-L файл-г файл-s файл-х файл-w файл-о файл-z строка-п строкаТаблица 19.38Возвращаемое зничение и описаниеИстина, если файл существует и является каталогомИстина, если файл существуетИстина, если файл существует и является простым файломИстина, если файл существует и для него установлен бит односторонней операцииИстина, если файл существует и является ссылкойИстина, если файл существует и доступен для чтенияИстина, если файл существует и его размер больше 0Истина, если файл существует и является исполнимымИстина, если файл существует и доступен для записиИстина, если файл существует и принадлежит данному пользователюИстина, если длина строки равна 0Истина, если длина строки не равна 0Команда test, в случае успешного завершения, возвращает значениеистина, то есть 0 — успешное завершение. Если в скобках стоит непустоеслово, test возвратит тоже 0, например:[ word ] ; echo $?О[]; echo $?1В первом случае возвращается истина (true), на экран выводится ноль код удачного (безошибочного) завершения программы.
Во втором случае наэкран выводится единица — команда test возвратила значение ложь (false).Сравнение строк осуществляется следующим образом: выражения strl =str2 или strl = = str2 истинны, когда строки strl и str2 равны. Обратитевнимание: между двумя символами равно не должно быть пропуска!442Полезные команды и программы. Создание РРМ-пакетовСимвол ! инвертирует любое условие команды test, например, выражение strl != strl будет истинным, когда строки strl и str2 не равны междусобой. Символ ! является символом логической операции NOT (отрицание).Кроме этого символа, можно использовать опции команды -о и -а, которыеобозначают логические операции ИЛИ (OR) и И (AND). Например:str="word"; export str; ["$str" -a -f / e t c / p a s s w d ] ; echo $?0str=""; export str; ["$str" -a -f / e t c / p a s s w d ] ; echo $?1В первом случае непустая строка str возвращает истину, опция —f возвращает также истину, потому что файл /etc/passwd существует всегда.Результат операции И: истина И истина = истина, поэтому на экране выувидите 0.Во втором случае пустая строка str возвратит ложь, а опция —f возвращает истину.
Результат операции И: ложь И истина = ложь. Если вы забылизаконы логики, освежите свои знания с помощью табл. 19.39.Логические операцииTrueTrueFalseANDTrueFalseТаблица 19.39FalseFalseFalseORTrueFalseTrueTrueTrueFalseTrueFalseXORTrueFalseTrueFalseTrueFalseTrueFalseОперация XOR — это исключающее ИЛИ. Данная операция не используется при создании сценариев с помощью интерпретатора bash.Для сравнения целых чисел используются опции команды test, приведенные в табл. 19.40.Сравнение целых чиселОпцияТаблица 19.40ОписаниеРавноНе равноМеньшеБольшеМеньше или равноБольше или равно-eq-пе-It-gt-le-geИнтерпретатор bash воспринимает строки, как целые числа.