После прочтения 24.2. Локальные переменные , я думал, что объявление переменной var
с ключевым словом local
означало, что var
значение было доступно только внутри блока кода, ограниченного фигурными скобками функции.
Однако после запуска следующего примера, я обнаружил, что var
также может быть доступна, и считываться из функций , вызываемых этого блоком кода - то есть , даже если var
декларируются local
к outerFunc
, innerFunc
все еще в состоянии прочитать и изменить его значение.
#!/usr/bin/env bash
function innerFunc() {
var='new value'
echo "innerFunc: [var:${var}]"
}
function outerFunc() {
local var='initial value'
echo "outerFunc: before innerFunc: [var:${var}]"
innerFunc
echo "outerFunc: after innerFunc: [var:${var}]"
}
echo "global: before outerFunc: [var:${var}]"
outerFunc
echo "global: after outerFunc: [var:${var}]"
Выход:
global: before outerFunc: [var:] # as expected, `var` is not accessible outside of `outerFunc`
outerFunc: before innerFunc: [var:initial value]
innerFunc: [var:new value] # `innerFunc` has access to `var` ??
outerFunc: after innerFunc: [var:new value] # the modification of `var` by `innerFunc` is visible to `outerFunc` ??
global: after outerFunc: [var:]
Q: Это ошибка в моей оболочке (bash 4.3.42, Ubuntu 16.04, 64bit) или это ожидаемое поведение?
РЕДАКТИРОВАТЬ: Решено. Как отмечает @MarkPlotnick, это действительно ожидаемое поведение.
var
пусто? var
установлен глобально innerFunc
, так почему же он не придерживается до конца скрипта?