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