bash 是否有区别,或者否定语句的首选用法?
if ! [[ -z "${var}" ]]; then
do_something
fi
相对
if [[ ! -z "${var}" ]]; then
do_something
fi
bash 是否有区别,或者否定语句的首选用法?
if ! [[ -z "${var}" ]]; then
do_something
fi
相对
if [[ ! -z "${var}" ]]; then
do_something
fi
如果整个测试返回 false,这将是 true
如果单个表达式返回 false,这将是 true。
由于测试可以是复合表达式,这可能会非常不同。例如:
就个人而言,我更喜欢在适用的测试构造中使用否定,但根据您的意图,它在外部完全没问题。
A
! cmd
实际上是一个管道,并且!
否定了整个管道的退出代码。来自 man bash:
从这个意义上说,一个:
!
是整个退出代码的否定( )[[
(一旦全部执行完毕)。因此,它的退出代码为 0:然而
A
[[ ! ]]
是复合命令(不是管道)。来自 man bash:因此,它的退出代码为 1:
因为这实际上等价于:
其中,通过短路评估,右侧
&&
永远不会被评估,实际上相当于这个更短的表达式:这将永远是错误的(1)。
简而言之:在里面
[[
,!影响表达式的一部分。首选
使用
!
inside[[
更为常见(并且可移植到更多的 shell(使用)),但如果不通过明智地使用 of来明确控制否定的范围(这可能成为构造内部的问题[
),有时可能会令人困惑。()
[
但是(在 bash、ksh 和 zsh 中)结果
! [[
非常明确且更易于理解:执行整体[[
并否定结果。应该使用哪一个是个人喜好(和理解)的问题。