我对在 bash 函数中设置局部变量感到困惑。
似乎使用
local dgt
local ltr
local braces
local da
可能比使用更安全
local dgt ltr braces da
我担心变量可能没有被定义为本地变量,或者没有设置值。那会发生吗?
例如,考虑
local foo="$(mycmd)"
命令的退出状态被创建局部变量的退出状态覆盖。
那么正确的代码是
local foo
foo=$(mycmd)
我对在 bash 函数中设置局部变量感到困惑。
似乎使用
local dgt
local ltr
local braces
local da
可能比使用更安全
local dgt ltr braces da
我担心变量可能没有被定义为本地变量,或者没有设置值。那会发生吗?
例如,考虑
local foo="$(mycmd)"
命令的退出状态被创建局部变量的退出状态覆盖。
那么正确的代码是
local foo
foo=$(mycmd)
只要本地命令本身在语法上最初是正确的,它也会被定义。本地命令不关心在本地命令求值之前或之后可能发生的任何命令替换(在子 shell 中执行)的退出值。
至少这是故意的。然而,错误可能无法使其按您预期的方式工作,尤其是在早期版本的 Bash 中定义数组值时。因此,有时确实将定义与声明分开可能更好。
FWIW,一些差异:
请注意,与许多其他 shell 不同的是,bash 不允许您对变量进行 decalre,就
local
好像它已被声明为readonly
在父作用域中一样。不过,就像 forlocal Ûnsupported¹ other_var
, in一样local readonly_var other_var
,我发现 inbash
,other_var
仍然最终被声明为local
。¹
local Ûnsupported
实际上适用于bash
,但仅适用于Û
以单个字节编码(并归类为isalpha()
)的语言环境。