Чтение онлайн

на главную

Жанры

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

Купер Мендель

Шрифт:
empty-line/>

# Спасибо S.C.

22.2. Локальные переменные

Что такое "локальная" переменная?

локальные переменные

Переменные, объявленные как локальные, имеют ограниченную область видимости, и доступны только в пределах блока, в котором они были объявлены. Для функций это означает, что локальная переменная "видна" только в теле самой функции.

Пример 22-8. Область видимости локальных переменных

#!/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-9. Использование локальных переменных при рекурсии

52

Herbert Mayer определяет рекурсию, как "...описание алгоритма с помощью более простой версии того же самого алгоритма..." Рекурсивной называется функция, которая вызывает самого себя.

53

Слишком глубокая рекурсия может вызвать крах сценария.

#!/bin/bash

recursive_function

{

(( $1 < $2 )) && recursive_function $(( $1 + 1 )) $2;

# Увеличивать 1-й параметр до тех пор,

#+ пока он не станет равным, или не превысит, второму параметру.

}

recursive_function 1 50000 # Глубина рекурсии = 50,000!

# Само собой -- Segmentation fault.

#

Рекурсия такой глубины может "обрушить" даже программу, написанную на C,

#+ по исчерпании памяти, выделенной под сегмент стека.

# Спасибо S.C.

exit 0 # Этот сценарий завершает работу не здесь, а в результате ошибки Segmentation fault.

#!/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. Не забывайте, что рекурсия весьма ресурсоемкое удовольствие, к тому же она выполняется слишком медленно, поэтому не следует использовать ее в сценариях.

Глава 23. Псевдонимы

Псевдонимы в Bash -- это ни что иное, как "горячие клавиши", средство, позволяющее избежать набора длинных строк в командной строке. Если, к примеру, в файл ~/.bashrc вставить строку alias lm="ls -l | more", то потом вы сможете экономить свои силы и время, набирая команду lm, вместо более длинной ls -l | more. Установив alias rm="rm -i" (интерактивный режим удаления файлов), вы сможете избежать многих неприятностей, потому что сократится вероятность удаления важных файлов по неосторожности.

Псевдонимы в сценариях могут иметь весьма ограниченную область применения. Было бы здорово, если бы псевдонимы имели функциональность, присущую макроопределениям в языке C, но, к сожалению, Bash не может "разворачивать" аргументы в теле псевдонима [ 54 ] . Кроме того, попытка обратиться к псевдониму, созданному внутри "составных конструкций", таких как if/then, циклы и функции, будет приводить к появлению ошибок. Практически всегда, действия, возлагаемые на псевдоним, более эффективно могут быть выполнены с помощью функций.

54

Однако, псевдонимы могут "раскручивать" позиционные параметры.

Поделиться:
Популярные книги

Законы Рода. Том 5

Flow Ascold
5. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Законы Рода. Том 5

Идеальный мир для Социопата 4

Сапфир Олег
4. Социопат
Фантастика:
боевая фантастика
6.82
рейтинг книги
Идеальный мир для Социопата 4

Архонт

Прокофьев Роман Юрьевич
5. Стеллар
Фантастика:
боевая фантастика
рпг
7.80
рейтинг книги
Архонт

Идущий в тени. Книга 2

Амврелий Марк
2. Идущий в тени
Фантастика:
фэнтези
6.93
рейтинг книги
Идущий в тени. Книга 2

Мне нужна жена

Юнина Наталья
Любовные романы:
современные любовные романы
6.88
рейтинг книги
Мне нужна жена

Я же бать, или Как найти мать

Юнина Наталья
Любовные романы:
современные любовные романы
6.44
рейтинг книги
Я же бать, или Как найти мать

Ратник

Ланцов Михаил Алексеевич
3. Помещик
Фантастика:
альтернативная история
7.11
рейтинг книги
Ратник

Барон нарушает правила

Ренгач Евгений
3. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон нарушает правила

Столичный доктор. Том III

Вязовский Алексей
3. Столичный доктор
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Столичный доктор. Том III

Ты не мой BOY

Рам Янка
5. Самбисты
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Ты не мой BOY

Маршал Советского Союза. Трилогия

Ланцов Михаил Алексеевич
Маршал Советского Союза
Фантастика:
альтернативная история
8.37
рейтинг книги
Маршал Советского Союза. Трилогия

Авиатор: назад в СССР 12

Дорин Михаил
12. Покоряя небо
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Авиатор: назад в СССР 12

Крестоносец

Ланцов Михаил Алексеевич
7. Помещик
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Крестоносец

Муж на сдачу

Зика Натаэль
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Муж на сдачу