Книга: Искусство программирования на языке сценариев командной оболочки
9.5. Косвенные ссылки на переменные
Предположим, что значение одной переменной -- есть имя второй переменной. Возможно ли получить значение второй переменной через обращение к первой? Например, Пусть a=letter_of_alphabet и letter_of_alphabet=z, тогда вопрос будет звучать так: "Возможно ли получить значение z, обратившись к переменной a?". В действительности это возможно и это называется косвенной ссылкой. Для этого необходимо прибегнуть к несколько необычной нотации eval var1=$$var2.
Пример 9-21. Косвенные ссылки
#!/bin/bash
# Косвенные ссылки на переменные.
a=letter_of_alphabet
letter_of_alphabet=z
echo
# Прямое обращение к переменной.
echo "a = $a"
# Косвенное обращение к переменной.
eval a=$$a
echo "А теперь a = $a"
echo
# Теперь попробуем изменить переменную, на которую делается ссылка.
t=table_cell_3
table_cell_3=24
echo ""table_cell_3" = $table_cell_3"
echo -n "разыменование (получение ссылки) "t" = "; eval echo $$t
# В данном, простом, случае,
# eval t=$$t; echo ""t" = $t"
# дает тот же результат (почему?).
echo
t=table_cell_3
NEW_VAL=387
table_cell_3=$NEW_VAL
echo "Значение переменной "table_cell_3" изменено на $NEW_VAL."
echo "Теперь "table_cell_3" = $table_cell_3"
echo -n "разыменование (получение ссылки) "t" = "; eval echo $$t
# инструкция "eval" принимает два аргумента "echo" и "$$t" (назначает равным $table_cell_3)
echo
# (Спасибо S.C. за разъяснения.)
# Еще один способ -- нотация ${!t}, будет обсуждаться в разделе "Bash, версия 2".
# Так же, см. пример "ex78.sh".
exit 0
Пример 9-22. Передача косвенных ссылок в awk
#!/bin/bash
# Другая версия сценария "column totaler"
# который суммирует заданную колонку (чисел) в заданном файле.
# Здесь используются косвенные ссылки.
ARGS=2
E_WRONGARGS=65
if [ $# -ne "$ARGS" ] # Проверка количества входных аргументов.
then
echo "Порядок использования: `basename $0` filename column-number"
exit $E_WRONGARGS
fi
filename=$1
column_number=$2
#===== До этой строки идентично первоначальному варианту сценария =====#
# Мнгострочные скрипты awk вызываются конструкцией awk ' ..... '
# Начало awk-сценария.
# ------------------------------------------------
awk "
{ total += $${column_number} # косвенная ссылка
}
END {
print total
}
" "$filename"
# ------------------------------------------------
# Конец awk-сценария.
# Косвенные ссылки делают возможным бесконфликтное
# обращение к переменным shell внутри вложенных сценариев awk.
# Спасибо Stephane Chazelas.
exit 0
- Косвенные мотивы
- Пример 9-21. Косвенные ссылки
- Пример 34-2. Косвенные ссылки на переменные -- новый метод
- Системные переменные ROWS_AFFECTED, GDSCODE, SQLCODE, TRANSACTIONJD, CONNECTIONJD
- Фрагменты знаний. Ссылки
- 1.2.3. Константы, переменные и типы
- 22.4.9 Несколькоадресные рассылки
- Глава 7 Электронные рассылки
- Лекция 11. Ссылки
- 3.1.3. Ссылки
- 22.3.3. Переменные окружения
- 8.3 Этап 3: переменные с произвольными именами; встроенные функции