以便携式方式检查shell变量的空白

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和bashdash的Linux PC更加模糊.

我正在寻找一个在不同shell环境中经验丰富的人的"专家答案",并且知道不同做事方式的缺陷,而不是像"应该工作"这样的意见.

zra*_*ajm 9

支架结构[...]是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链接上运行的其他计算机上运行,则将不起作用。)如果要使用双等号,则还应使用双括号[[...]](其中仅适用于zshbash等等,但不适用于)的普通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肯定不需要它们。)因此,忽略这一点大概是安全的。


rvi*_*dal 6

免责声明:我不认为自己是 shell 专家。

据我所知,该test命令和-z-n标志是POSIX标准的一部分,所以你应该在许多平台上使用他们被罚款。

  • 它们是:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html (3认同)
  • 任何 ** 与 POSIX shell 一起工作** **-not-** 完全可以与 *** 任何合理兼容的类似 sh 的 shell 一起工作***。POSIX 是一个**新人**,并不是在最初的 `sh` 之前创建的。人们在尝试推广之前应该了解他们的标准。 (2认同)