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−wordparameter 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=”之间有区别吗?的主要内容,如果未能解决你的问题,请参考以下文章

nginx通过shell脚本平滑升级版本

MySql定时备份脚本

Python 视图与复制错误希望我仅在脚本中使用 .loc

让 shell 显示当前 git 的分支名称

使用批处理脚本删除字符串直到第一次出现字符

[Lua快速了解一下]Lua运行