Искусство программирования на языке сценариев командной оболочки
Шрифт:
Пример 11-14. Изменение значений позиционных параметров (аргументов)
#!/bin/bash
variable="one two three four five"
set -- $variable
# Значения позиционных параметров берутся из "$variable".
first_param=$1
second_param=$2
shift; shift #
remaining_params="$*"
echo
echo "первый параметр = $first_param" # one
echo "второй параметр = $second_param" # two
echo "остальные параметры = $remaining_params" # three four five
echo; echo
# Снова.
set -- $variable
first_param=$1
second_param=$2
echo "первый параметр = $first_param" # one
echo "второй параметр = $second_param" # two
# ======================================================
set --
# Позиционные параметры сбрасываются, если не задано имя переменной.
first_param=$1
second_param=$2
echo "первый параметр = $first_param" # (пустое значение)
echo "второй параметр = $second_param" # (пустое значение)
exit 0
См. так же Пример 10-2 и Пример 12-40.
unset
Команда unset удаляет переменную, фактически -- устанавливает ее значение в null. Обратите внимание: эта команда не может сбрасывать позиционные параметры (аргументы).
bash$ unset PATH
bash$ echo $PATH
bash$
Пример 11-15. "Сброс" переменной
#!/bin/bash
# unset.sh: Сброс переменной.
variable=hello # Инициализация.
echo "variable = $variable"
unset variable # Сброс.
# Тот же эффект дает variable=
echo "(unset) variable = $variable" # $variable = null.
exit 0
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
Однако, как заметил Greg Keraunen, в некоторых ситуациях такая комбинация может давать иной результат, нежели раздельная инициализация и экспорт.
bash$ export var=(a b); echo ${var[0]}