hyd*_*yde 12 bash sh dash-shell
在shell脚本中测试变量是否为空/未定义的可移植和规范方法是什么?它应该适用于所有类似sh的壳.我现在做的是:
if [ -z "$var" ] ; then
...
Run Code Online (Sandbox Code Playgroud)
而对于反向,当变量不为空/未定义时执行某些操作:
if [ -n "$var" ] ; then
...
Run Code Online (Sandbox Code Playgroud)
虽然这些对我现在编写的脚本起作用,但我想知道一种方法,它可以在任何合理兼容的sh- like shell中工作,甚至比使用GNU userland和bash或dash的Linux PC更加模糊.
我正在寻找一个在不同shell环境中经验丰富的人的"专家答案",并且知道不同做事方式的缺陷,而不是像"应该工作"这样的意见.
支架结构[...]是POSIX标准的一部分,几乎在所有地方都安全。因此,要测试变量是否为空if,问题中使用的大小写是完美的:
if [ -z "$STRING" ]; then
# $STRING is empty
fi
Run Code Online (Sandbox Code Playgroud)
只要您记得比:
不带引号的变量会进行分词,因此,如果您使用[ -z $STRING ](不带引号$STRING)并且$STRING包含空格或为空,则Shell将看到[ -z SEVERAL WORDS ]或[ -z ]都是语法错误–即不是您想要的。
如果测试POSIX shell中的字符串是否为空,则可以使用另一种方法=。
if [ "$STRING" = "" ]; then
# $STRING is empty
fi
Run Code Online (Sandbox Code Playgroud)
但是请注意,切勿==在内部使用双等号()[...]!(这仅是bash或当sh链接到时有效bash–但是,如果在其他sh链接上运行的其他计算机上运行,则将不起作用。)如果要使用双等号,则还应使用双括号[[...]](其中仅适用于zsh,bash等等,但不适用于)的普通POSIX shell dash。
&&或||内[...]它可能在某些外壳中有效,但肯定不能在所有外壳中均有效。取而代之的是' 和 'write [...] && [...]或[... -a ...]。而对于“ 或 ”写[...] || [...]或[... -o ...]。
有时,在非常古老的Shell脚本中,您会看到类似以下内容的内容,以测试一个空变量。这仍然是完全有效的(但在我看来有点笨拙),而且我从未遇到过需要此功能的外壳程序(不过,坦白地说,我的经验仅限于Linux之外,也许还有BSD外壳程序仍需要此功能?)
if [ ".$STRING" = "." ]; then
# $STRING is empty
fi
Run Code Online (Sandbox Code Playgroud)
句号的开头是为了避免括号结构[...](如果$STRING碰巧包含-e)-o和其他[...]使用的选项引起混淆。通过在句号之前加一个句号,它变成了一个非选择项。
不过,我从未见过shell需要这种解决方法。(Dash肯定不需要它们。)因此,忽略这一点大概是安全的。
免责声明:我不认为自己是 shell 专家。
据我所知,该test命令和-z和-n标志是POSIX标准的一部分,所以你应该在许多平台上使用他们被罚款。