Sau khi đọc 24.2. Các biến cục bộ , tôi nghĩ rằng việc khai báo một biến varbằng từ khóa localcó nghĩa varlà giá trị đó chỉ có thể truy cập được trong khối mã được phân định bởi các dấu ngoặc nhọn của hàm.
Tuy nhiên, sau khi chạy ví dụ sau, tôi phát hiện ra rằng varcũng có thể được truy cập, đọc và viết từ các chức năng gọi bởi rằng khối mã - tức là mặc dù varđược khai báo localđể outerFunc, innerFuncvẫn có thể đọc nó và thay đổi giá trị của nó.
#!/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}]"
Đầu ra:
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:]
H: Có phải đó là một lỗi trong trình bao của tôi (bash 4.3.42, Ubuntu 16.04, 64 bit) hay đó là hành vi dự kiến?
EDIT: Đã giải quyết. Theo ghi nhận của @MarkPlotnick, đây thực sự là hành vi được mong đợi.
varnó là trống không? varđược đặt trên toàn cầu innerFunc, vậy tại sao nó không được sử dụng cho đến khi kết thúc tập lệnh?