在脚本中初始化 bash 变量的值(在主代码之前)或在将实际值分配给函数中的局部变量之前初始化它有什么优点/缺点吗?
我需要做这样的事情吗:
init()
{
name=""
name=$1
}
init "Mark"
是否存在使用垃圾值初始化变量(如果未初始化)并对变量值产生负面影响的风险?
答案1
将空字符串分配给变量然后立即将另一个变量字符串分配给它没有任何好处。给 shell 变量赋值将完全覆盖其先前的值。
据我所知,没有任何建议表明您应该将变量显式初始化为空字符串。事实上,这样做可能会掩盖某些情况下的错误(如果在 下运行,错误会很明显set -u
,请参见下文)。
未设置的变量,自脚本启动后未使用或通过unset -v
在其上运行命令显式取消设置的变量将没有任何值。这样的变量的值将为零。如果用作"$myvariable"
,您将得到相当于""
,并且您永远不会得到“垃圾数据”。
如果 shell 选项nounset
设置为set -o nounset
或set -u
,则引用未设置的变量将导致 shell 产生错误(并且非交互式 shell 将终止):
$ set -u
$ unset -v myvariable
$ echo "$myvariable"
/bin/sh: myvariable: parameter not set
或者,在bash
:
$ set -u
$ unset -v myvariable
$ echo "$myvariable"
bash: myvariable: unbound variable
如果名称对应于现有的环境变量,Shell 变量将由环境初始化。
如果您希望使用可以通过环境以这种方式初始化的变量(并且如果不需要),那么您可以在脚本的主要部分之前显式取消设置它:
unset -v myvariable # unset so that it doesn't inherit a value from the environment
...这也会将其作为环境变量删除,或者您可以简单地忽略它的初始值并用赋值覆盖它(这也会使环境变量的值发生变化)。
您永远不会在 shell 变量中遇到未初始化的垃圾(除非如上所述,该垃圾已存在于同名的环境变量中)。
答案2
编辑:哎呀,显然声明与初始化不同。无论如何,我会将其留在这里,以便像我这样的新手程序员可以从我的错误中吸取教训。
在函数中声明局部变量的优点是可以轻松复制代码。
例如,假设我有一个函数:
foo(){
local name
name="$1"
echo "$name"
}
如果我想将其写入脚本,我只需忽略该local
语句并复制其他所有内容:
#!/bin/bash
name="$1"
echo "$name"
如果声明和赋值位于同一行,我必须手动编辑该local
部分,然后才能将其转换为脚本:
foo(){
local name="$1"
echo "$name"
}
在这个例子中,这不是什么大问题,但如果你正在处理更大、更复杂的函数,它可能会变得更加痛苦。