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 var
bằng từ khóa local
có nghĩa var
là 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 var
cũ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
, innerFunc
vẫ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.
var
nó 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?