24.2 okuduktan sonra Yerel Değişkenler , var
anahtar kelimeyle bir değişken bildirmenin , değerine yalnızca bir işlevin kıvrımlı parantezleri tarafından sınırlandırılmış kod bloğu içinde erişilebilir olduğu local
anlamına geldiğini düşündüm var
.
Ancak, şu örneği çalıştırdıktan sonra, ben öğrendim var
da okumak, erişilebilir ve o kod bloğunda tarafından çağrılan işlevlerden yazılabilir - yani rağmen var
bildirilmiş local
için outerFunc
, innerFunc
yine okumak ve değerini değiştirmek yapabiliyor.
#!/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}]"
Çıktı:
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:]
S: Bu benim kabuğumdaki bir hata mı (bash 4.3.42, Ubuntu 16.04, 64bit) ya da beklenen davranış mı?
EDIT: Çözüldü. @MarkPlotnick tarafından belirtildiği gibi, bu gerçekten beklenen bir davranış.
var
boş olmasının garip olduğunu düşünen tek kişi ben miyim ? var
küresel olarak yerleştirilmiş innerFunc
, öyleyse neden betiğin sonuna kadar sadık kalmıyor?