Setelah membaca 24.2. Variabel Lokal , saya berpikir bahwa mendeklarasikan variabel vardengan kata kunci localberarti bahwa varnilai hanya dapat diakses dalam blok kode yang dibatasi oleh kurung kurawal suatu fungsi.
Namun, setelah menjalankan contoh berikut, saya menemukan bahwa varjuga dapat diakses, dibaca dan ditulis dari fungsi dipanggil oleh blok kode - yaitu meskipun vardinyatakan localuntuk outerFunc, innerFuncmasih bisa membacanya dan mengubah nilainya.
#!/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}]"
Keluaran:
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:]
T: Apakah itu bug di shell saya (bash 4.3.42, Ubuntu 16.04, 64bit) atau apakah itu perilaku yang diharapkan?
EDIT: Dipecahkan. Seperti dicatat oleh @MarkPlotnick, ini memang perilaku yang diharapkan.
varkosong? vardiatur secara global innerFunc, jadi mengapa tidak tetap sampai akhir skrip?