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

echo "var2 declared as $var2" # Допускается ли изменять значение readonly переменных?

var2=13.37 # Сообщение об ошибке и завершение работы сценария.

echo "значение переменной var2 осталось прежним $var2" # Эта строка никогда не будет выполнена.

exit 0 # Сценарий завершит работу выше.

<p><strong>9.5. Косвенные ссылки на переменные</strong></p>

Предположим, что значение одной переменной -- есть имя второй переменной. Возможно ли получить значение второй переменной через обращение к первой? Например, Пусть a=letter_of_alphabet и letter_of_alphabet=z, тогда вопрос будет звучать так: "Возможно ли получить значение z, обратившись к переменной a?". В действительности это возможно и это называется косвенной ссылкой. Для этого необходимо прибегнуть к несколько необычной нотации eval var1=\$$var2.

<p><strong>Пример 9-21. Косвенные ссылки</strong></p>

#!/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

<p><strong>Пример 9-22. Передача косвенных ссылок в </strong><emphasis><strong>awk</strong></emphasis></p>

#!/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.

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных