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标准的一部分,所以你应该在许多平台上使用他们被罚款。