Shell脚本:“local foo”和“local foo =”之间有区别吗?

时间:2012-08-10 20:25:14

标签: linux shell centos

我在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}"

他们之间有什么不同吗?

1 个答案:

答案 0 :(得分:3)

是的,的区别。考虑以下功能:

x() {
    local a b=

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

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

$ x
X

$

如果参数未设置,则${parameter−word} parameter expansion会扩展为word(在本例中为X),如果已设置,则扩展为参数值。

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

修改

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

$ x


$

在函数内调用set可验证local a中的bash-3.x是否将该变量初始化为空字符串。然而,这似乎是一个错误。来自bash更改日志:

  

本文档详细介绍了此版本bash-4.0-beta之间的变化,   和以前的版本,bash-4.0-alpha。

     

...

     

即修复了导致使用空创建局部变量的错误       字符串表示值而不是值。