在将脚本中的bash变量的值赋给实际值之前,在主代码之前或在函数中的局部变量之前初始化脚本中的bash变量的值是否有任何优点/缺点?
我需要做这样的事情吗?
init()
{
name=""
name=$1
}
init "Mark"
是否存在使用垃圾值初始化变量(如果未初始化)以及对变量值产生负面影响的风险?
name = ""; name = argv[1];
吗?难道就没有意义吗?
在将脚本中的bash变量的值赋给实际值之前,在主代码之前或在函数中的局部变量之前初始化脚本中的bash变量的值是否有任何优点/缺点?
我需要做这样的事情吗?
init()
{
name=""
name=$1
}
init "Mark"
是否存在使用垃圾值初始化变量(如果未初始化)以及对变量值产生负面影响的风险?
name = ""; name = argv[1];
吗?难道就没有意义吗?
Answers:
将空字符串分配给变量,然后立即为其分配另一个变量字符串没有任何好处。将值分配给Shell变量将完全覆盖其先前的值。
据我所知,没有建议说应该将变量显式初始化为空字符串。实际上,这样做可能会掩盖某些情况下的错误(如果set -u
在下运行,这些错误会很明显,请参阅下文)。
自脚本开始以来未使用过的未设置变量,或者通过在脚本上运行unset
命令而未明确设置的未设置变量将没有任何值。这样的变量的值将为空。如果用作"$myvariable"
,您将获得的等效值""
,并且您将永远不会获得“垃圾数据”。
如果将shell选项nounset
设置为set -o nounset
或set -u
,则引用未设置的变量将导致Shell产生错误(并且非交互式Shell将终止):
$ set -u
$ echo "$myvariable"
/bin/sh: myvariable: parameter not set
或者,在bash
:
$ set -u
$ echo "$myvariable"
bash: myvariable: unbound variable
如果变量名称与现有的环境变量相对应,Shell变量将由环境初始化。
如果您希望使用的变量可以由环境以这种方式初始化(如果不需要的话),那么可以在脚本的主要部分之前显式取消设置它:
unset myvariable # unset so that it doesn't inherit a value from the environment
这也将其删除为环境变量,或者,您可以简单地忽略其初始值,而仅用赋值覆盖它(这也会使环境变量更改值)。
您将永远不会在shell变量中遇到未初始化的垃圾(除非声明,除非该垃圾已经以相同的名称存在于环境变量中)。
unset
运行某种for
或while
循环将其设置为计算值之前,先设置空值(或ting)是有价值的如果由于不满足条件而有可能使循环实际上无法运行的值;并且在脚本继承的环境中,该变量可能已设置为其他值。但是,最好将所有内容都放入a main()
并将变量定义为local
。
:
,例如${myvariable-defaultvalue}
编辑:糟糕,声明显然与初始化不同。无论如何,我都会把它留在这里,以便像我这样的新手程序员可以从我的错误中学习。
在函数中声明局部变量的好处是您可以轻松地复制代码。
例如,说我有一个函数:
foo(){
local name
name="$1"
echo "$name"
}
如果要将其制作为脚本,则只需忽略该local
语句并复制其他所有内容:
#!/bin/bash
name="$1"
echo "$name"
如果声明和赋值在同一行中,那么我必须先手动将local
零件编辑掉,然后才能将其转换为脚本:
foo(){
local name="$1"
echo "$name"
}
在此示例中,这没什么大不了的,但是如果您要处理更大,更复杂的功能,则可能会更加痛苦。