Что такое «локальная» переменная?
- локальные переменные
-
Переменные, объявленные как локальные, имеют ограниченную область видимости, и доступны только в пределах блока, в котором они были объявлены. Для функций это означает, что локальная переменная «видна» только в теле самой функции.
Пример 22-11. Область видимости локальных переменных
-
#!/bin/bash
-
func ()
-
{
-
local loc_var=23 # Объявление локальной переменной.
-
echo
-
echo «\»loc_var\» в функции = $loc_var«
-
global_var=999 # Эта переменная не была объявлена локальной.
-
echo «\»global_var\» в функции = $global_var«
-
}
-
func
-
# Проверим, «видна» ли локальная переменная за пределами функции.
-
echo
-
echo «\»loc_var\» за пределами функции = $loc_var«
-
# «loc_var» за пределами функции =
-
# Итак, $loc_var не видна в глобальном контексте.
-
echo «\»global_var\» за пределами функции = $global_var«
-
# «global_var» за пределами функции = 999
-
# $global_var имеет глобальную область видимости.
-
echo
-
exit 0
Переменные, объявляемые в теле функции, считаются необъявленными до тех пор, пока функция не будет вызвана. Это касается всех переменных.
-
#!/bin/bash
-
func ()
-
{
-
global_var=37 # Эта переменная будет считаться необъявленной
-
#+ до тех пор, пока функция не будет вызвана.
-
} # КОНЕЦ ФУНКЦИИ
-
echo «global_var = $global_var« # global_var =
-
# Функция «func» еще не была вызвана,
-
#+ поэтому $global_var пока еще не «видна» здесь.
-
func
-
echo «global_var = $global_var« # global_var = 37
-
# Переменная была инициализирована в функции.
-
22.2.1.
Локальные переменные делают возможной рекурсию.
Хотя локальные переменные и допускают рекурсию, [52] но она сопряжена с большими накладными расходами и не рекомендуется для использования в сценариях. [53]
Пример 22-12. Использование локальных переменных при рекурсии
-
#!/bin/bash
-
# факториал
-
# ———
-
# Действительно ли bash допускает рекурсию?
-
# Да! Но…
-
# Нужно быть действительно дубинноголовым, чтобы использовать ее в сценариях
-
# на языке командной оболочки.
-
MAX_ARG=5
-
E_WRONG_ARGS=65
-
E_RANGE_ERR=66
-
if [ -z «$1» ]
-
then
-
echo «Порядок использования: `basename $0` число»
-
exit $E_WRONG_ARGS
-
fi
-
if [ «$1» -gt $MAX_ARG ]
-
then
-
echo «Выход за верхний предел (максимально возможное число — 5).»
-
# Вернитесь к реальности.
-
# Если вам захочется поднять верхнюю границу,
-
# то перепишите эту программу на настоящем языке программирования.
-
exit $E_RANGE_ERR
-
fi
-
fact ()
-
{
-
local number=$1
-
# Переменная «number» должна быть объявлена как локальная,
-
# иначе результат будет неверный.
-
if [ «$number« -eq 0 ]
-
then
-
factorial=1 # Факториал числа 0 = 1.
-
else
-
let «decrnum = number — 1»
-
fact $decrnum # Рекурсивный вызов функции.
-
let «factorial = $number * $?»
-
fi
-
return $factorial
-
}
-
fact $1
-
echo «Факториал числа $1 = $?.»
-
exit 0
Еще один пример использования рекурсии вы найдете в Пример A-18. Не забывайте, что рекурсия весьма ресурсоемкое удовольствие, к тому же она выполняется слишком медленно, поэтому не следует использовать ее в сценариях.
[52] Herbert Mayer определяет рекурсию, как «…описание алгоритма с помощью более простой версии того же самого алгоритма…» Рекурсивной называется функция, которая вызывает самого себя.
[53] Слишком глубокая рекурсия может вызвать крах сценария.
- Страница для печати
- 10281 просмотр