我無法解釋以下行為unset:
#!/bin/bash
my_unset() { unset "$@"; }
fn1() { local var; unset var; var=1; }
fn2() { local var; my_unset var; var=2; }
var=0
fn1; echo "$var"
fn2; echo "$var"
0
2
編輯:我希望結果是1 2
它的行為方式bash 3/4/5是這樣的,這是一個錯誤嗎?
更新
這是另一個示例,它表明 usingmy_unset不會使變數成為全域變數;它只從當前背景關系中洗掉區域變數:
#!/bin/bash
my_unset() { unset "$@"; }
fn1() { local var; my_unset var; var=1; }
fn2() { local var; fn1; echo "[fn2] var=$var"; }
var=0
fn2
echo "[global] var=$var"
[fn2] var=1
[global] var=0
uj5u.com熱心網友回復:
請參閱 Chet在 2012 年的回答:
早在幾年前(確切地說是 16 年),bash 的行為與您預期的一樣。在 bash-1.14 和 bash-2.0 之間,我更改了它以回應一些錯誤報告,這些錯誤報告抱怨在函式中宣告為本地的變數在未設定后在函式中分配值時不是本地的。Bash 在函式的變數背景關系中保留了一個占位符,因此對該未設定變數的后續參考不會遍歷呼叫鏈。此占位符會影響函式呼叫的函式,該函式以您期望動態作用域起作用的方式取消設定區域變數。
但是,這只會影響當前函式:正如您所發現的,從呼叫鏈下游發出的未設定將取消設定區域變數而不創建占位符。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/532032.html
下一篇:更正python代碼以使用函式
