echo "(unset) variable = $variable" # $variable = null.
exit 0
export
Команда exportэкспортирует переменную, делая ее доступной дочерним процессам. К сожалению, невозможно экспортировать переменную родительскому процессу. В качестве примера использования команды exportможно привести сценарии инициализации системы, вызываемые в процессе загрузки, которые инициализируют и экспортируют переменные окружения, делая их доступными для пользовательских процессов.
Пример 11-16. Передача переменных во вложенный сценарий awk, с помощью export
#!/bin/bash
# Еще одна версия сценария "column totaler" (col-totaler.sh)
# который суммирует заданную колонку (чисел) в заданном файле.
# Здесь используются переменные окружения, которые передаются сценарию 'awk'.
ARGS=2
E_WRONGARGS=65
if [ $# -ne "$ARGS" ] # Проверка количества входных аргументов.
then
echo "Порядок использования: `basename $0` filename column-number"
exit $E_WRONGARGS
fi
filename=$1
column_number=$2
#===== До этой строки идентично первоначальному варианту сценария =====#
export column_number
# Экспорт номера столбца.
# Начало awk-сценария.
# ------------------------------------------------
awk '{ total += $ENVIRON["column_number"]
}
END { print total }' $filename
# ------------------------------------------------
# Конец awk-сценария.
# Спасибо Stephane Chazelas.
exit 0
Допускается объединение инициализации и экспорта переменной в одну инструкцию: export var1=xxx.
Однако, как заметил Greg Keraunen, в некоторых ситуациях такая комбинация может давать иной результат, нежели раздельная инициализация и экспорт.
bash$ export var=(a b); echo ${var[0]}
(a b)
bash$ var=(a b); export var; echo ${var[0]}
a
declare, typeset
Команды declare и typeset задают и/или накладывают ограничения на переменные.
readonly
То же самое, что и declare -r, делает переменную доступной только для чтения, т.е. переменная становится подобна константе. При попытке изменить значение такой переменной выводится сообщение об ошибке. Эта команда может расцениваться как квалификатор типа constв языке C.
getopts
Мощный инструмент, используемый для разбора аргументов, передаваемых сценарию из командной строки. Это встроенная команда Bash, но имеется и ее "внешний" аналог /usr/bin/getopt, а так же программистам, пишущим на C, хорошо знакома похожая библиотечная функция getopt. Она позволяет обрабатывать серии опций, объединенных в один аргумент [ 25 ] Опция -- это аргумент, который управляет поведением сценария и может быть либо включен, либо выключен. Аргумент, который объединяет в себе несколько опций (ключей), определяет поведение сценария в соответствии с отдельными опциями, объединенными в данном аргументе..
и дополнительные аргументы, передаваемые сценарию (например, scriptname -abc -e /usr/local).
С командой getoptsочень тесно взаимосвязаны скрытые переменные. $OPTIND -- указатель на аргумент ( OPTion INDex ) и $OPTARG ( OPTion ARGument ) -- дополнительный аргумент опции. Символ двоеточия, следующий за именем опции, указывает на то, что она имеет дополнительный аргумент.
Обычно getoptsупаковывается в цикл while, в каждом проходе цикла извлекается очередная опция и ее аргумент (если он имеется), обрабатывается, затем уменьшается на 1 скрытая переменная $OPTIND и выполняется переход к началу новой итерации.
1.
Опциям (ключам), передаваемым в сценарий из командной строки, должен предшествовать символ "минус" ( - ) или "плюс" ( + ). Этот префикс ( - или + ) позволяет getoptsотличать опции (ключи) от прочих аргументов. Фактически, getoptsне будет обрабатывать аргументы, если им не предшествует символ - или + , выделение опций будет прекращено как только встретится первый аргумент.
2. Типичная конструкция цикла whileс getoptsнесколько отличается от стандартной из-за отсутствия квадратных скобок, проверяющих условие продолжения цикла.
3. Пример getopts, заменившей устаревшую, и не такую мощную, внешнюю команду getopt.
while getopts ":abcde:fg" Option
# Начальное объявление цикла анализа опций.
# a, b, c, d, e, f, g -- это возможные опции (ключи).
# Символ : после опции 'e' указывает на то, что с данной опцией может идти
# дополнительный аргумент.
Читать дальше