3

我在 CentOS 上的 /etc/init.d/functions 中找到了以下代码。

status() {
    local base pid lock_file= pid_file=
    ...

声明了 4 个变量。其中两个未初始化,base 和 pid。但其余的都是用空值、lock_file 和 pid_file 初始化的。

我测试了以下代码,没有发现任何差异。

local a b=

echo "a is $a, length is ${#a}"
echo "b is $b, length is ${#b}"

它们之间有什么区别吗?

4

1 回答 1

3

是的,有区别。考虑以下函数:

x() {
    local a b=

    echo ${a-X}
    echo ${b-X}
}

调用此函数会bash-4.x产生以下输出:

$ x
X

$

如果未设置参数,则${parameter−word} 参数扩展扩展为word(在这种情况下X)的扩展,或者如果设置了参数值,则扩展为参数值。

从示例输出中,很明显local a未设置变量a,而local b=将其显式设置为空 (null) 字符串。

编辑:

另一方面,bash-3.x你得到这个:

$ x


$

对函数内的调用set验证local ainbash-3.x将该变量初始化为空字符串。然而,这似乎是一个错误。从bash变更日志:

本文档详细介绍了此版本 bash-4.0-beta 与先前版本 bash-4.0-alpha 之间的更改。

...

e. 修复了导致局部变量使用空字符串创建值而不是没有值的错误。

于 2012-08-12T23:35:28.877 回答