Shell 脚本:“local foo”和“local foo=”之间有区别吗?
Posted
技术标签:
【中文标题】Shell 脚本:“local foo”和“local foo=”之间有区别吗?【英文标题】:Shell Script: Is there a difference between "local foo" and "local foo="? 【发布时间】:2012-08-08 04:12:45 【问题描述】:我在 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"
它们之间有什么区别吗?
【问题讨论】:
Local 是用于函数的,对吧?如果您在函数外部设置了foo
的值,会发生什么情况? (我没有方便测试的 bash)。祝你好运。
和其他语言一样,我们不能从“本地声明语句”中引用外部变量。因此,如果您声明与外部变量同名的局部变量,它将被视为其他变量。
【参考方案1】:
是的,是不同的。考虑以下函数:
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
验证bash-3.x
中的local a
将该变量初始化为空字符串。然而,这似乎是一个错误。来自bash
更新日志:
本文档详细介绍了这个版本之间的变化,bash-4.0-beta, 和之前的版本,bash-4.0-alpha。
...
e。修复了导致局部变量创建为空的错误 一个值而不是没有值的字符串。
【讨论】:
感谢您的回复!但是 x 函数对我不起作用,它显示 2 个空行。我检查了 bash(3.2.48) 和 zsh(4.3.11)。我的环境有问题吗? 非常感谢!我可以用 bash-4.2.37 确认这一点。我对shell脚本不太了解,所以我会更多地学习它!以上是关于Shell 脚本:“local foo”和“local foo=”之间有区别吗?的主要内容,如果未能解决你的问题,请参考以下文章