#!/bin/bash
# Сценарий 1
NUM="one"; (NUM="two"; echo $NUM;);
echo $NUM
#!/bin/bash
# Сценарий 2
NUM="one"; {NUM="two"; echo $NUM;};
echo $NUM
Сценарий 1 выведет на экран следующую информацию:
two
one
а сценарий 2:
two
two
С помощью механизма подоболочек вы можете создавать более гибкие сценарии. С его помощью, например, можно временно изменять рабочий каталог:
pwd; (cd /tmp; pwd;); pwd
Сценарий выведет на экран:
/home/user
/tmp
/home/user
19.7.4. Переменные и массивы
Пример простейшей переменной мы уже рассмотрели выше. Переменные в bash не нуждаются в предварительном описании, как в других языках, например, в том же Pascal. Все переменные в bash — текстовые. Имя переменной должно начинаться с буквы и может состоять из латинских букв, цифр, знака подчеркивания. Нельзя определять функцию и переменную с одинаковыми именами. Чтобы воспользоваться значением переменной, нужно использовать символ доллара перед именем переменной:
VAR="my var"
echo $VAR
Как я уже говорил, все переменные текстовые. Например, когда вы присваиваете переменной значение VAR=13, то это будет не числовое значение, а строка из двух символов. Если присваиваемое значение имеет пробелы, его нужно взять в кавычки:
VAR="value 1"
Присвоить значение переменной можно с помощью встроенной команды read:
echo –n "Enter value: "
read x
echo $x
Параметр –n команды echo не выводит символ новой строки в конце сообщения «Enter value:», то есть не переводит строку. Команда read читает значение, введенное пользователем с клавиатуры, и записывает его в переменную х. Последняя команда выводит только что введенное значение. При использовании команды read можно указывать несколько переменных:
read a b с
Пользователь должен ввести значения переменных, разделяя их пробелами. Для окончания ввода нужно нажать «Enter». Если введено меньше значений, чем нужно, оставшимся переменным будет присвоена пустая строка. А если больше, то лишние значения будут проигнорированы.
Интерпретатор bash использует следующие метасимволы, имеющие для него особое значение:
* ? ; & ( ) | < > <возврат_каретки> <табуляция> <пробел>
Для того, чтобы использовать эти символы как они есть, нужно их цитировать с помощью символа . Например, символ перевода строки можно цитировать как n, символ табуляции как t, а символ вопроса как ?
Особое значение при присваивании переменным значений имеют кавычки. Все символы, заключенные в одинарные кавычки ' ' представляют самих себя. Между двойными кавычками " " выполняются команды и подстановки значений. Символы "", ",", " ' ", "$" могут цитироваться с помощью обратной наклонной черты: \, $, '
Для обозначения параметров командной строки используются специальные переменные, указанные в табл. 19.36.
Специальные переменные Таблица 19.36
Название переменной Значение $0 Имя выполняемой команды. Для сценария — путь, указанный при его вызове. Если вы знакомы с языком программирования Pascal, эта переменная должна вам напоминать вызов функции ParamStr(0) $n (где n – номер параметра, $1, $2, …) Обращение к параметру с номеров n. Для Pascal — это вызов функции ParamStr(n) $# Число параметров, которые были указаны при вызове сценария. Аналогична вызову функции ParamCount в Pascal $* Все параметры, заключенные в кавычки: "$1 $2 …" [email protected] Все параметры, каждый из которых заключен в кавычки "$1" "$2" … $? Код завершения последней команды $$ Номер текущего процесса (PID) $! Номер(PID) последнего асинхронного процесса (команды, выполненной в фоновом режиме)
Пример.
echo "Все параметры: "
echo $*
Интерпретатор bash поддерживает одномерные массивы с неограниченным числом элементов. В других оболочках существуют определенные ограничения на массивы, например, в ksh максимальное число элементов массива ограничено 1024-мя элементами.
Присвоить значение элементу массива можно с помощью такой конструкции:
Имя_массива[индекс]=значение
Например:
А[1]=23
А[3]=54
А[0]=77
Нумерация элементов начинается с ноля. Тип элементов массива, как и тип переменных, текстовый. Присвоить значение элементам массива можно также с помощью инструкции set. Например, выражение:
set –A array 3 56 77 12
аналогично выражениям:
array[0]=3
array[1]=56
array[2]=77
array[3]=12
Вышеприведенные способы инициализации массивов могут применяться как в bash, так и в ksh, а также и в других оболочках. Но, тем не менее, существует еще один способ, который работает только в bash:
array = ([0]=3 [3]=12 [2]=77 [1]=5б)
Обратиться к значению элемента можно следующим образом:
${имя_массива[индекс]}
Например, вывести значение первого (нулевого) элемента массива можно так:
echo {$array[0]}
Обратиться ко всем элементам массива сразу можно с помощью одного из выражений:
${имя_массива[*]} или ${имя_массива[@]}
Если значение хотя бы одного элемента массива может содержать пробелы, используйте второе выражение:
echo ${array[@]}
Особое значение имеют переменные окружения. У каждого процесса есть своя среда — множество доступных ему переменных. Обыкновенные переменные доступны только из локального процесса. Чтобы использовать их значения в порождаемых процессах, нужно использовать встроенную команду export. После того, как вы экспортируете переменные, они будут доступны всем порожденным процессам.
Выражение export:
export имя
export имя=значение
export имя имя имя …
export имя=значение имя имя=значение…
Как видите, можно экспортировать уже инициализированную переменную (которой уже присвоено значение), а можно выполнить инициализацию переменной непосредственно при экспорте. Экспортировать можно как одну переменную, так и целый список.
Для деактивизации переменной используется команда unset: unset имя
Каждому процессу доступны переменные оболочки, приведенные в табл. 19.37.
Переменные оболочки Таблица 19.37
Название переменной Значение PWD Текущий каталог UID Идентификатор пользователя, запустившего сценарий REPLY Последняя строка, введенная с помощью команды read RANDOM Случайное число в диапазоне от 0 до 32767 SECONDS Число секунд, прошедшее с момента запуска оболочки IPS (Internal Filed Separator) Внутренний разделитель полей. Используется синтаксическим анализатором и командой read для разделения строчки на слова. По умолчанию его значение равно " tn", где: « » — пробел; «t» — символ табуляции; ,«n» — символ новой строки HOME Домашний каталог PATH Путь вызова LOGNAME Имя пользователя, которое использовалось для входа в систему MAIL Имя файла, в который поступает электронная почта SHELL Имя интерпретатора команд TERM Тип терминала пользователя
Пример.
echo "$НОМЕ"
19.7.5. Подстановка команд и арифметических выражений
В гл. 13 (п. 13.5) мы уже сталкивались с подстановкой команд. Тогда переменной DT присваивался результат выполнения команды date: