Колисниченко Д.Н. - Linux-сервер своими руками (1077324), страница 102
Текст из файла (страница 102)
Если нужнообнулить строку, то это достигается таким присваиванием: х=0.Пример.х=124 ; export х ;[ 111 -It "$х" ]; echo $?ОПоскольку 111 меньше, чем 124, на экране вы увидите 0 (истина).Примечание.Во всех примерах, вы, наверное, заметили использование команды export. Это необходимо для того, чтобы порожденному процессу (не забывайте: test — это отдельнаяпрограмма) переменная х была доступна.443Полезные команды и программы. Создание RPM-пакетовТеперь, когда мы уже знакомы с конструкциями test и if, рассмотримнебольшой пример, демонстрирующий вложенность операторов if и использование команды test.
Пример приведен в листинге 19.2.Листинг 19.2. Пример вложенности операторовecho -n "Какую оценку ты получил сегодня по программированию? "read xif [ $х = 5 ]then echo "Отлично !"elif [ $х = 4 ]then echo "Хорошо"e l i f [ $x = 3 ]then echo "Удовлетворительно"e l i f [ $x = 2 ]then echo "Надо бы пересдать"else echo "Как вообще можно было получить такую оценку???"fiЕсли вы введете 5, сценарий отобразит на экране слово «Отлично», привводе 4 вы увидите слово «Хорошо» и так далее.
Если вы введете О, 1 иличисло больше пяти, вы увидите на экране последнюю фразу: «Как вообщеможно было получить такую оценку???».Конструкция case-esacКонструкция выбора (case — выбор) имеет следующий синтаксис:case значение inшаблон!) список! ;;шаблонМ)esacсписокЫ ;;Рассмотрим сценарий (см. листинг 19.3), аналогичный сценарию 19.2,но использующий конструкцию case вместо if.Листинг 19.3. Пример использования оператора coseecho -n " Какую оценку ты получил сегодня по программированию?\\read xcase $x in5) echo "Отлично !" ;;4) echo "Хорошо" ;;3) echo "Удовлетворительно" ;;2) echo "Надо бы пересдать" ;;*} echo "Как вообще можно было получить такую оценку???"/ /esacРабота сценария аналогична первому сценарию: при вводе оценок 2, 3,4, 5 будут отображены соответствующие сообщения, а во всех остальныхслучаях — последнее сообщение.444Полезные команды и программы. Создание РРМ-пакетовПримечание.Структура оператора case больше напоминает структуру оператора case в языкеPascal, чем в языке С.
Последняя строка выбора с шаблоном *) будет выбрана, когдане произойдет ни одного совпадения с ранее указанными шаблонами. Если же произошло совпадение с шаблоном шаблоны, то будет выполнен список списокЫ. Послевыполнения списка команд списокЫ будет произведен выход из структуры case — также как и в Pascal.
В языке С наблюдается нечто другое: если будет обнаруженосовпадение, скажем с шаблоном 3, то будут выполнены последовательности операторов 3, 4, 5, ... N. Чтобы прервать выполнение блока case в языке С нужно использовать оператор break. В bash же такого нет.Если для одного списка команд нужно описать два или более шаблонов,используется символ | (OR).case num in1 | 2 | 3 ) echo "1 or 2 or 34 | 5 ) echo "4 or 5" ; ;*) echo "other num";;esacЦиклыИнтерпретаторы bash и ksh поддерживают циклы for, while, until, select, aинтерпретатор sh только for и while.Синтаксис цикла for:for имя_переменной inсписок!doсписок2doneПростой пример:for i in 1 2 3 4 5; do echo $i; doneНа экране вы увидите:1 2 3 4 5Еще раз напомню, что любой список в bash должен заканчиватьсяточкой с запятой.
Начинающие «программисты» делают много ошибок,связанных именно с этой особенностью списков. Пример использования:построчно вывести содержимое файла /etc/passwd вы можете с помощьютакого цикла:fordostrin'cat/etc/passwd4echo " $ s t r " ;doneЦикл for закончит свою работу, когда будет обработан последний элемент списка, в данном случае, когда на экран будет выведена последняястрока файла /etc/passwd.Синтаксис цикла while:while список!doсписок2done445Полезные команды и программы.
Создание RPM-пакетовЦикл while будет выполняться, пока условие, заданное в списке список!,будет истинным. Поэтому цикл while иногда называют циклом с истиннымусловием. Например,х=1while [$х -It 10]doecho $хX=$(($Х+1))doneНа экране вы увидите: 1 2 3 4 5 6 7 8 9Когда переменная х примет значение 10, цикл завершит свою работу,так как программа test вернет значение false (x уже не меньше, а равен 10).Цикл until (до) имеет похожую структуру, но выполняется несколькоиначе:until список!doсписок2doneЦикл until прекратит работу, когда условие, указанное в списке список!,станет истинным. Другими словами, он будет выполняться пока это условиеложно. Цикл while, наоборот, выполняется пока условие истинно.
Лучше всегоразница между этими циклами видна на примере (сравните листинги 19.4 и 19.5)Листинг 19.4. Цикл whileх=1;х=1;while ! [$х -де 10]doecho $xX = $(( $Х + 1 ))doneЛистинг 19.5. Цикл untiluntil [$x -де 10]doecho $xX = $<($Х + 1))doneЦиклы, приведенные в листингах 19.4 и 19.5, выведут одинаковую последовательность цифр на экран:1 2 3 4 5 6 7 8 9 10Рассмотрим еще один полезный цикл select, который позволяет создавать нумерованные пункты меню. Его конструкция такова:select имя in список!doсписок2doneПример:echo "Выберите файл для просмотраselect file in /home/den/temp/* QUITdoif [-e $file]; then less $fileelsebreakdone;446Полезные команды и программы. Создание RPM-пакетовВ моем временном каталоге /home/den/temp находится всего два файла — f i l e .
t x t , p r o t o . t x t , поэтому на экране монитора будет отображено следующее:Выберите файл для просмотра:/home/den/temp/./home/den/temp/../home/den/temp/file.txt/home/den/temp/proto.txtQUITПервые два файла — это ссылки на текущий и родительский каталоги.Пункты меню 3 и 4 — это файлы, которые можно выбрать для просмотра.QUIT — это последний элемент списка. При его выборе сработает операторbreak и цикл завершится.19.7.7. Подстановка переменныхМы уже рассмотрели подстановку команд, сейчас рассмотрим подстановку переменных (см. табл. 19.41).Подстановка переменныхТаблица 19.41Конструкция${переменная:-значение)${ переменна:=значение }${переменная:?сообщение}${переменная:+значение)${переменная}ОписаниеЕсли переменная определена и не является пустой строкой, подставляетсяее значение, иначе подставляется значение, указанное в конструкции.Реальное значение переменной при этом не изменяетсяЗначение присваивается переменной, если она не определена илиявляется пустой строкойЕсли переменная не определена или является пустой строкой, выводитсяуказанное сообщениеЕсли переменная инициализирована (определена), вместо нее используетсяуказанное в конструкции значение.
Реальное значение переменной не изменяетсяЕсли переменная определена, то подставляется ее значение. Скобкииспользуются лишь тогда, если после переменной стоит символ, которыйможет «приклеиться» к имени переменнойПример.${1 :? "Не хватает параметра"}Данное сообщение будет выведено, если сценарий будет запущен безпараметров. Если указать хотя бы один параметр, сообщение не будетотображаться на экране.19.7.8.
ФункцииОписание функции выглядит так:имя () { список; }Пример:cdir(){# изменяем каталогcd /447Полезные команды и программы. Создание RPM-пакетовПри выполнении функция не создает нового процесса, а выполняется всреде процесса, содержащего эту функцию. Аргументы функции можно передать ей как обыкновенные параметры при вызове сценария. Функции можноописывать в любом месте сценария, но вызов функции должен осуществлятьсятолько после ее описания.
Возвращаясь к примеру, модифицируйте функцию:#!/bin/bash# файл fnecho $$cdir(){# изменяем каталогecho "Х=$Х"Х=2echo "Params $0 $# $1 $2"echo "PID = $$"return 0cd $1)X=lechocdirechoecho"X=$X"/etc# вызов функции "cd" с параметрами$?"X=$X"На экране вы увидите примерно следующую информацию:788Х=1Х=1Params fn I /etc788ОХ=2Проанализируем полученную информацию. Как уже отмечалось, функция не порождает нового процесса, поэтому PID остался равным 788 как довызова функции, так и во время ее выполнения.
Переменная X доступнанашей функции, потому что описана до вызова функции. Функция «видит»значение переменной X, установленное в основном бло*ке сценария. Затемфункция изменяет значение переменной X и передает его в основной блок(Х=2). Функции был передан только один параметр — /etc, вместо второгопараметра была отображена пустая строка. Имя файла осталось прежним fn. Обратите внимание на важный момент: функция сообщила нам многополезной информации об устройстве функций в bash, но не оправдаласвоего названия — cdir (change dir). Реально изменения каталога не произошло, потому что перед выполнением команды cd была выполнена команда return с кодом завершения 0, которая прервала выполнение функции.448Полезные команды и программы. Создание РРМ-пакетов19.7.9.
Обработка сигналов и протоколированиеВозможно, вы хотите обеспечить выполнение вашего сценария послевыхода пользователя из интерпретатора или выполнить какие-нибудь действия при отключении удаленного пользователя от системы. «Перехватить»сигнал (прерывание) можно с помощью команды trap. Формат команды trapследующий:trap имя сигналыгде: имя- это имя функции или набор команд, которые должны бытьвыполнены при получении сигнала;сигналы -- наиболее часто используется перехват сигналов, описанныхв табл. 19.42. Полный список сигналов вы найдете в гл. 5.СигналыТаблица 19.42НомерНазваниеОписание0102SIGHUPSIGINT03SIGQUITВыход (quit)09SIGKILLУничтожение процесса (kill).
He перехватывается и не игнорируется15SIGTERMОсвобождение линии (hangup)Прерывание (interrupt)Программный сигнал завершенияПример. Игнорирование сигналов 1, 2, 3, 15trap : 1 2 3 15: — это пустой оператор, не выполняющий никаких действий.Рассмотрим, как можно протоколировать работу собственного сценария. Для этого существуют два способа -- с помощью команды tee икоманды script.Способ 1:$LOGFILE=my_logif ["$LOGGING" != "true"] then export LOGGING="true"; exec $0I tee $LOGFILE; fiСпособ 2:$LOGFILE=my_logif ["$LOGGING" != " t r u e " ] ;script $0 $LOGFILE; fithen export LOGGING="true"; execВ первом случае мы устанавливаем флаг протоколирования LOGGING изаново запускаем наш сценарий. При этом перенаправляем весь стандартныйвывод команде tee, которая выполнит протоколирование.
Второй способаналогичен первому за исключением того, что мы не будем самостоятельнозапускать сценарий — это за нас выполнит команда script. Оба способа можноиспользовать для протоколирования работы других программ:script program -/program.log15 Зак. 85144920Графический интерфейспользователя.Система X WindowСистема X Window является мощной графической средой для UNIXстанций.
Данная система была разработана Массачусетским технологическим институтом (MIT) и стала стандартом для всех UNIX-систем. Практически каждая рабочая станция UNIX работает на одном из вариантовсистемы X Window.Группа программистов, возглавляемая Дэвидом Вексельблатом (DavidWexelblat) создала свободно распространяемую версию MIT X Window дляпроцессоров i80386-Pentium IV и совместимых с ними.
Эта версия получиланазвание XFree86, поскольку могла выполняться в операционных системах,предназначенных для процессоров, использующих систему команд х86 — Linux,FreeBSD и другие. XFree86 является торговой маркой XFree86 Project, Inc.Данная глава включена в книгу последней, так как графический интерфейс на сервере — это излишество. Зачем тратить драгоценные системныересурсы на графический интерфейс, если хороший администратор подходитк серверу очень редко, а иногда вообще один раз — во время первоначальной настройки? Однако, если вы начинающий администратор, графическийинтерфейс поможет вам быстрее настроить тот или иной сервис. Можетслучиться такое, что вы установите новую версию дистрибутива и окажется,что расположение некоторых системных файлов будет изменено.