测试 shell 脚本中的变量是否为空

rah*_*hmu 29 shell shell-script portability test

我已经看到在许多不同的 shell 上多次使用以下技术来测试变量是否为空:

if [ "x$1" = "x" ]; then 
    # Variable is empty
fi
Run Code Online (Sandbox Code Playgroud)

与更规范的相比,使用它有什么优势if [ -z "$1" ]吗?会不会是便携性问题?

Gil*_*il' 21

一些历史 shell 实现了一个非常简单的解析器,它可能会被诸如[ -n = "" ]第一个操作数 to=看起来像一个运算符之类的东西混淆,并将其解析为[ -n = ]或导致语法错误。在 中[ "x$1" = x"" ],x前缀确保它x"$1"不可能看起来像一个运算符,因此外壳程序可以解析此测试的唯一方法是将其=视为二元运算符。

所有现代 shell,甚至仍在运行的大多数旧 shell,都遵循POSIX 规则,该规则要求正确解析最多 4 个单词的所有测试表达式。因此[ -z "$1" ]是测试的一个适当的方式,如果$1是空的,并且[ "$x" = "$y" ]是测试两个变量的平等之有道。

甚至一些当前的 shell 也会与更长的表达式混淆,并且一些表达式实际上是不明确的,所以避免使用-aand-o运算符来构造更长的布尔测试,而是使用单独调用[shell 自己的&&和||布尔运算符。

  • 这不仅仅是_历史_炮弹。某些商业 Unices 上的一些基于 ksh88 的 `sh` 仍然存在问题。有关详细信息,请参阅 [此处](http://www.in-ulm.de/~mascheck/various/test/)。 (4认同)

Ans*_*ann 5

根据http://www.mpi-inf.mpg.de/~uwe/lehre/unixffb/quoting-guide.html,该-z测试在某些实现中是不安全的,大概是在"-o a=a"测试“有趣”的字符串时。