0

我最近在我的 bash 脚本中发现了这个“错误”;

if [ "$var" ]; then
    echo "Condition is true"
fi

我的意思是检查是否$var为非空,即[ -n "$var" ]. 碰巧的是,如果没有-n. 同样,我发现我可以替换[ -z "$var" ][ ! "$var" ].

我倾向于喜欢这种基于其他语言中变量的(非)空性的隐含虚假性(真实性),因此我也可能在 bash 中采用这种模式。这样做是否有任何危险,即两组语法不等价的边缘情况?

4

2 回答 2

1

所以我们替换:

-n "$var"   ->    "$var" 
-z "$var"   ->    ! "$var"

这看起来不错,有些人会这样做。在某些极端情况下,删除将是有害的并导致语法错误。这些极端情况特别包括时间,其中var等于有效test参数。前任。var=-nvar="!"等等。

前任:

$ 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)上找到不使用-oand来破坏它的方法-a。无论如何,测试手册页建议使用&&and||而不是-aand -o

但是在POSIX 规范测试中我们可以找到以下应用笔记:

两个命令:

测试“$1”
测试!“1美元”

无法在某些历史系统上可靠地使用。如果使用这样的字符串表达式并将 $1 扩展为 '!'、'(' 或已知的一元主表达式,则会出现意外结果。更好的构造是:

测试 -n "$1"
测试 -z "$1"

所以我认为只要你不使用“一些历史系统”,你就安全了。但值得冒险吗?你必须自己回答。

也就是说,主观的:我更看重可维护性和可读性,而不是保存为 3 个字符并查找-n-z更具可读性。意图-n很明确 - 测试字符串是否具有-n零长度。with 的意图-z也很明确 - 测试字符串是否具有-zero 长度。我发现别人写[ "$var" ][ ! "$var" ]. 乍一看,里面好像$var有一些特殊的含义[ ]

我最近在我的 bash 脚本中发现了这个“错误”

这不是一个错误,这是一个功能!

于 2019-03-29T08:51:07.957 回答
0

首先,您使用单括号。这意味着您使用的是test命令而不是 Bash 内置函数。从手册:

test EXPRESSION[ EXPRESSION ]退出并返回状态EXPRESSION

-n STRING: 的长度STRING不为零。

STRING: 相当于-n STRING

资源:man test

这应该回答你的问题。

此外:

! EXPRESSION: test返回EXPRESSION_

-z STRING: 如果 的长度为零,则test返回true 。STRING

这意味着[ ! STRING ]相当于[ -z STRING ]

于 2019-03-29T11:15:13.223 回答