所以我们替换:
-n "$var" -> "$var"
-z "$var" -> ! "$var"
这看起来不错,有些人会这样做。在某些极端情况下,删除将是有害的并导致语法错误。这些极端情况特别包括时间,其中var
等于有效test
参数。前任。var=-n
或var="!"
等等。
前任:
$ v1="-n" v2=""; [ -n "$v1" -o -z "$v2" ]; echo $?
0
但
$ v1="-n" v2=""; [ "$v1" -o ! "$v2" ]; echo $?
bash: [: too many arguments
2
也就是说,我无法在我的系统(bash 5.0.0)上找到不使用-o
and来破坏它的方法-a
。无论如何,测试手册页建议使用&&
and||
而不是-a
and -o
。
但是在POSIX 规范测试中我们可以找到以下应用笔记:
两个命令:
测试“$1”
测试!“1美元”
无法在某些历史系统上可靠地使用。如果使用这样的字符串表达式并将 $1 扩展为 '!'、'(' 或已知的一元主表达式,则会出现意外结果。更好的构造是:
测试 -n "$1"
测试 -z "$1"
所以我认为只要你不使用“一些历史系统”,你就安全了。但值得冒险吗?你必须自己回答。
也就是说,主观的:我更看重可维护性和可读性,而不是保存为 3 个字符并查找-n
和-z
更具可读性。意图-n
很明确 - 测试字符串是否具有-n
零长度。with 的意图-z
也很明确 - 测试字符串是否具有-z
ero 长度。我发现别人写[ "$var" ]
和[ ! "$var" ]
. 乍一看,里面好像$var
有一些特殊的含义[
]
。
我最近在我的 bash 脚本中发现了这个“错误”
这不是一个错误,这是一个功能!