Shell脚本:“本地foo”和“本地foo =”有区别吗?

我在CentOS上的/etc/init.d/functions中find下面的代码。

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

声明了4个variables。 其中两个没有初始化,base和pid。 但其余的都是用空值,lock_file和pid_file初始化的。

我testing了下面的代码,发现没有区别。

 local ab= echo "a is $a, length is ${#a}" echo "b is $b, length is ${#b}" 

他们之间有什么分别吗?

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

 x() { local ab= echo ${aX} echo ${bX} } 

bash-4.x调用这个函数会导致这个输出:

 $ x X $ 

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

从示例输出中,显而易见的是, local a将变量unset,而local b=将其明确地设置为空(空)字符串。

编辑:

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

 $ x $ 

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

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

即 修复了一个错误,导致使用空字符串创建局部变量而不是没有值。