如何将只读变量范围限制为函数?

oar*_*ish 3 bash

我在脚本中使用readonly local如下变量定义函数:

test.sh

function test_function() {
    readonly local foo="bar"
}
Run Code Online (Sandbox Code Playgroud)

在采购之前,foo当然是未定义的

$> echo $foo

$>
Run Code Online (Sandbox Code Playgroud)

但是当我获取并运行该函数时

$> source test.sh
$> test_function
$> echo $foo
bar
$>
Run Code Online (Sandbox Code Playgroud)

突然间,变量泄漏超出了其范围。删除readonly即可解决问题。我对 a 的使用有什么误解,readonly并且local两者都可以使用而不会出现此问题吗?

用例是,test_function多次调用时我收到错误/警告,因为该变量应该是只读的,但已经定义了。

Joh*_*024 5

代替:

readonly local foo="bar"
Run Code Online (Sandbox Code Playgroud)

和:

local -r foo="bar"
Run Code Online (Sandbox Code Playgroud)

问题是readonly local foo="bar"定义了两个只读变量:一个名为named local,一个名为named foo。它不会创建任何局部变量。

相比之下,local -r foo="bar"创建一个名为的变量foo,该变量既是本地的又是只读的。

正如David C Rankin指出的那样,一旦创建了全局只读变量,就无法取消设置它。您需要关闭现有的 shell 并启动一个新的 shell。