หลังจากอ่าน24.2 ตัวแปรท้องถิ่นผมคิดว่าการประกาศตัวแปรvar
ด้วยคำหลักlocal
นั่นหมายความว่าvar
ค่า 's สามารถเข้าถึงได้เฉพาะภายในบล็อกของรหัสที่คั่นด้วยวงเล็บปีกกาของฟังก์ชั่น
อย่างไรก็ตามหลังจากรันตัวอย่างต่อไปนี้ฉันพบว่า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:]
ถาม: นั่นเป็นจุดบกพร่องในเชลล์ของฉัน (bash 4.3.42, Ubuntu 16.04, 64 บิต) หรือเป็นพฤติกรรมที่คาดหวังหรือไม่?
แก้ไข:แก้ไขแล้ว ตามที่ระบุไว้โดย @MarkPlotnick นี่เป็นพฤติกรรมที่คาดหวัง
var
ว่างเปล่า? var
มีการตั้งค่าทั่วโลกในinnerFunc
ดังนั้นทำไมมันไม่ติดจนกว่าจะสิ้นสุดของสคริปต์?