初始化 Bash 变量 - 是必需的、推荐的还是定义的

Cyr*_*rus 9 bash variable

在主代码之前或函数中的局部变量之前,在脚本中初始化 bash 变量的值是否有任何优点/缺点,然后再将实际值分配给它?

我是否需要做这样的事情:

init()
{
    name=""
    name=$1
}

init "Mark"
Run Code Online (Sandbox Code Playgroud)

是否有使用垃圾值初始化变量(如果未初始化)以及对变量值产生负面影响的风险?

Kus*_*nda 22

将一个空字符串分配给一个变量,然后立即将另一个变量字符串分配给它没有任何好处。为 shell 变量赋值将完全覆盖其先前的值。

据我所知,没有任何建议说您应该将变量显式初始化为空字符串。事实上,这样做可能会在某些情况下掩盖错误(如果在 下运行set -u,错误会很明显,见下文)。

未设置的变量,自脚本启动以来未使用或通过在其unset上运行命令显式取消设置,将没有值。这样一个变量的值将是什么。如果用作"$myvariable",您将获得相当于"",并且永远不会获得“垃圾数据”。

如果 shell 选项nounset设置为set -o nounsetset -u,则引用未设置的变量将导致 shell 产生错误(并且非交互式 shell 将终止):

$ set -u
$ echo "$myvariable"
/bin/sh: myvariable: parameter not set
Run Code Online (Sandbox Code Playgroud)

或者,在bash

$ set -u
$ echo "$myvariable"
bash: myvariable: unbound variable
Run Code Online (Sandbox Code Playgroud)

如果变量的名称对应于现有的环境变量,则 Shell 变量将由环境初始化。

如果您希望使用的变量可能会以这种方式由环境初始化(如果不需要),那么您可以在脚本的主要部分之前明确取消设置它:

unset myvariable    # unset so that it doesn't inherit a value from the environment
Run Code Online (Sandbox Code Playgroud)

这也会将它作为环境变量删除,或者,您可以简单地忽略它的初始值并用赋值覆盖它(这也会使环境变量值改变)。

您永远不会在 shell 变量中遇到未初始化的垃圾(除非如前所述,垃圾已存在于同名的环境变量中)。

  • 虽然将变量设置为空值然后立即像 OP 那样立即设置它没有任何价值,但在运行某种“for”或“之前”设置空值(或“取消设置”)是有价值的while` 循环将其设置为计算值,如果有可能由于不满足条件而导致循环实际上不会运行;并且该变量可能已设置为脚本继承的环境中的某个其他值。但可以说最好将所有内容都放在 `main()` 中并将变量定义为 `local`。 (3认同)