Книга: Искусство программирования на языке сценариев командной оболочки

Пример 11-16. Передача переменных во вложенный сценарий awk, с помощью 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' указывает на то, что с данной опцией может идти

# дополнительный аргумент.

do

case $Option in

a ) # Действия, предусмотренные опцией 'a'.

b ) # Действия, предусмотренные опцией 'b'.

...

e) # Действия, предусмотренные опцией 'e', а так же необходимо обработать $OPTARG,

# в которой находится дополнительный аргумент этой опции.

...

g ) # Действия, предусмотренные опцией 'g'.

esac

done

shift $(($OPTIND - 1))

# Перейти к следующей опции.

# Все не так сложно, как может показаться ;-)

Оглавление книги

Оглавление статьи/книги

Генерация: 5.785. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз