Материал: 396_OS_uchebnoe_posobie_part1_2012

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

3

[student@wp1 student]$_

переменной foo будет присвоено значение, равное 3.

Условная подстановка переменных является ещё одним механизмом подстановки значений (таблица 4).

Таблица 4. Виды условной подстановки переменных

Форма подстановки

Описание

${перем:-значение}

Если переменная не определена или равна NULL,

 

вместо неё будет использовано значение. Содер-

 

жимое переменной при этом не изменяется.

${перем:+значение}

Если переменная установлена, то вместо неё

 

подставляется значение. Содержимое перемен-

 

ной при этом не изменяется.

${переменная:=значение}

Если переменная не определена или равна NULL,

 

то ей присваивается значение, которое сразу и

 

подставляется.

${перем:?сообщение}

Если переменная не определена или равна

 

NULL, в стандартный поток ошибок выводится

 

сообщение.

${перем:смещение}

Выделяет из переменной часть строки, начиная

 

со смещения и заканчивая концом строки.

${перем:смещение:длина}

Выделяет из переменной часть строки указанной

 

длины, начиная со смещения.

${#переменная}

Подставляет длину содержащейся в переменной

 

строки в символах.

${перем/что/на_что} или

Подставляет значение «перем» с заменой указан-

${перем//что/на_что}

ной строки «что» на указанную строку

 

«на_что». Значение самой переменной не изме-

 

няется. Если перед полем «что» указан один

 

слеш, то произойдёт замена только одного вхож-

 

дения подстроки «что». Если указано два слеша,

 

то произойдёт замена всех вхождений подстроки

 

«что».

Например, используя условную подстановку переменных, можно проверить правильность задания некоторой команды:

[student@wp1 student]$${COMMA:?Нет команды}<Enter> -bash: COMMA: Нет команды

[student@wp1 student]$_

41

Командная оболочка проверит, есть ли переменная с именем COMMA и присвоено ли ей какое-либо значение. Если переменная есть, и у неё есть значение, то оно будет интерпретировано как команда (так как в команде кроме подстановки ничего больше нет). Если же переменной нет, или ей не присвоено никакого значения, то вместо интерпретации команды на экран будет выдано сообщение «Нет команды».

Заменить символ «пробел» в строке, хранящейся в переменной DB, на символ «_» можно так: DB=${DB// /_}.

4.12. Формат приглашения командной оболочки

Как уже было сказано выше, командная оболочка предлагает пользователю вводить команды, используя определённое приглашение. Формат этого приглашения задаётся с помощью переменных окружения: PS1, PS2, PS3, PS4. Переменная PS1 определяет обычную командную строку. Переменная PS2

– командную строку, выдаваемую при продолжении команды на следующей строке (2-я и последующие строки, если перед нажатием клавиши Enter был введён символ «\»).

В строку приглашения могут входить любые допустимые символы, команды терминала и специальные символьные последовательности, которые используются для получения информации о системе (таблица 5).

Таблица 5. Специальные последовательности формата командной строки.

Послед.

Выводимое значение

\t

время в формате часы: минуты: секунды

\d

дата в формате день_недели месяц число

\n

перевод строки

\s

имя оболочки, базовое имя $0 (участок, следующий за конечным /)

\w

текущий рабочий каталог

\W

базовое имя $PWD

\u

имя текущего пользователя

\h

сетевое имя компьютера

\#

номер этой команды

\!

номер истории этой команды

\nnn

символ, имеющий код, равный nnn в восьмеричной системе

\$

если uid=0, то \#, иначе \$

\\

обратный слеш

\[

начало терминальной последовательности

\]

конец терминальной последовательности

Чтобы изменить формат приглашения командной оболочки, достаточно присвоить необходимое значение соответствующей переменной. Например, выделить текущего пользователя зелёным цветом можно, присвоив переменной PS1 следующее значение:

42

PS1=[\[\033[32m\]\u\[\033[0m\]@\h \W]\$

4.13. Получение информации от пользователя

При необходимости командная оболочка позволяет сформировать значение некоторой переменной, «спросив» его у пользователя. Для этого используется команда read, которой в качестве аргумента передаётся имя требуемой переменной.

[student@wp1 student]$read CHOICE Привет !!!<Enter>

[student@wp1 student]$echo “Вы ввели ”${CHOICE}

Привет !!!

[student@wp1 student]$_

Чтобы указать, какое приглашение должно быть выведено в строке для ввода, можно использовать параметр -p. Например, read -p “Введите X” X.

Время ожидания (в секундах) ввода задаётся или при помощи переменной TMOUT, или при помощи параметра -t. Если переменная TMOUT не определена или её значение равно 0, и не указан параметр -t, то время ожидания считается бесконечным. Обратите внимание, что значение переменной TMOUT также влияет на время ожидания командной оболочкой очередной команды!!!

Используя параметр -s, можно запретить отображение вводимых символов на экране. Это удобно, например, при вводе паролей.

4.14. Управляющие структуры

Командная оболочка BASH позволяет организовать ветвление программы

взависимости от различных условий.

4.14.1.Условный оператор if-fi

Выражение if записывается следующим образом30:

$if выражение1 ; then \ >выражение2 ; \

>elif выражение3 ; then \ >выражение4 ; \

>else \ >выражение5 ; \ >fi<Enter>

В приведённой выше команде if сначала выполняется выражение1. Если код завершения выражения1 равен 0 (что интерпретируется как его

30 В дальнейшем по тексту будем использовать сокращенный формат приглашения командной строки, состоящей только из символа $.

43

истинность), то выполняется выражение2, и команда if заканчивается. В противном случае выполняется выражение3, и проверяется код его завершения. Если выражение3 возвращает значение, равное 0, то выполняется выражение4 и команда if. Если выражение3 возвращает ненулевое значение, то выполняется выражение5. Наличие операторов elif и else необязательно. В блоке if-fi может содержаться несколько elif.

Часто в блоке if-fi в качестве выражений, результаты которых проверяются, используется команда test, которая имеет две формы записи: test параметры или [ параметры ]. После интерпретации параметров (таблица 6) как логического выражения команда test возвращает значение 0 – истина либо 1 – ложь.

Таблица 6. Некоторые параметры команды test.

Выражение

Значение

-d файл

существует ли файл и является ли он каталогом?

-e файл

существует ли указанный файл?

-f файл

существует ли файл и является ли он обычным файлом?

-L файл

существует ли файл и символьная ли он ссылка?

-r файл

существует ли файл и разрешено ли его чтение?

-s файл

существует ли файл и имеет ли он нулевой размер?

-w файл

существует ли файл и разрешена ли в него запись?

-x файл

существует ли файл и является ли он исполняемым?

-O файл

существует ли файл и принадлежит ли он текущему поль-

 

зователю?

файл1 -nt файл2

был ли файл1 последний раз модифицирован позже, чем

 

файл2?

-z строка

указанная строка имеет нулевую длину?

-n строка

указанная строка имеет ненулевую длину?

стр1 == стр2

указанные строки совпадают?

! выражение

указанное выражение false?(содержит не нуль)

выр1 -a выр2

логическое И двух выражений

выр1 -o выр2

логическое ИЛИ двух выражений

выр1 -eq выр2

выр1 равно выр2?

выр1 -ne выр2

выр1 неравно выр2?

выр1 -lt выр2

выр1 меньше (в арифметическом смысле) выр2?

выр1 -le выр2

выр1 меньше либо равно выр2?

выр1 -gt выр2

выр1 больше выр2?

выр1 -ge выр2

выр1 больше либо равно выр2?

Ниже приведены примеры использования команды test в составе выражения if-fi:

$if [ -d $HOME/bin ] ; then \ >PATH="$PATH:$HOME/bin" ; fi

44

$if [ -z "$DTHOME" ] && [-d /home/student/dt ] ;then \ >DTHOME=/home/student/dt ; \

>fi

$if [ -z "$DTHOME" -a -d /home/student/dt ] ; then \ >DTHOME=/home/student/dt ; \

>fi

В первом примере проверяется, существует ли каталог $HOME/bin, и, если он существует, то он добавляется к переменной PATH.

Во втором и третьем случае проверяется, установлено ли значение переменной DTHOME, и существует ли каталог /home/student/dt. Если переменная не определена или имеет пустое значение, и указанный каталог существует, то переменной DTHOME задаётся новое значение. Во втором примере проверка указанного условия происходит с использованием списка из двух команд test, выполняемых по условию «И». В третьем примере используется один вызов команды test, в параметрах которой указаны все условия (условие «И» реализуется с помощью опции -a).

Следует обратить внимание, что при проверке значения переменной DTHOME она взята в кавычки. Это сделано так потому, что, если переменная всё-таки не определена или определена, но не имеет значения, то вместо неё в командную строку ничего не будет подставлено. Если кавычки не использовать, то после подстановки потеряется второй параметр команды test, и нечего будет проверять (т.е. строка test -z $DTHOME будет преобразована к виду test -z).

4.14.2. Оператор множественного выбора case-esac

Блок case-esac аналогичен оператору if-fi со множеством elfi и предназначен для проверки одной переменной на несколько возможных значений. Блок case-esac записывается следующим образом:

$case значение in \ >шаблон1) \ >список команд1 ;; >шаблон2) \ >список команд2 ;; >esac<Enter>

В данном случае значение – это строка символов, сравниваемая с шаблоном до тех пор, пока она не совпадёт с ним. Список команд, следующий за шаблоном, которому удовлетворяет значение, запускается на выполнение. За списком следует команда «;;», которая завершает работу блока case-esac.

Если значение не удовлетворяет ни одному из шаблонов, выражение case

45

Источник: https://studfile.net/preview/16708918/