在Bash条件语句中,感叹号是在括号内还是括号外有何影响?

21

看起来您可以将否定条件写成

if ! [[ ... ]]; then
或者
if [[ ! ... ]]; then

假设操作的语义相同,那么选择一种方法还是另一种方法有理由吗? (也就是说,显然,在第二个版本中,如果 ... 是一个复合语句,并且你没有仔细地对表达式进行分组,则可能只会否定表达式的第一部分。)


请查看:在Bash脚本中否定条件 - Cyrus
@Cyrus 感谢提供链接;那里的答案解释了有等效形式,但并没有解释为什么要选择其中一种形式。因此,我认为这个问题仍然具有独立价值。 - mhucka
1
我也同意你的观点。因此,我没有将这个问题标记为重复。 - Cyrus
我曾经看到过这种情况,它似乎无法做出决定。 - Brain2000
1个回答

18

不,这完全取决于您自己的喜好。下一个命令是完全等效的:

if [[ $x -ne $y ]]; then
if ! [[ $x -eq $y ]]; then
if [[ ! $x -eq $y ]]; then

你的偏好可能基于不同的条件:

  • if [[ $x -ne $y ]]; then: 简单比较,没有任何复杂性,如普通变量比较。
  • if ! [[ $x -eq $y ]]; then: 假设您有一个复杂的 if 条件,它可能是一些函数的结果,而不是 $x -eq $y
  • if [[ ! $x -eq $y ]]; then: 没必要,使用第一或第二种,具体取决于您拥有的 if 条件类型。我从不使用这个!

1
这个推理同样适用于使用单括号的命令吗?谢谢。 - Josh
@Josh,我不确定你的意思是什么。你能给一个例子吗? - campovski
1
如果 [ ! -d $dirname ]; then someaction; else otheraction; fi 与 if ! [ -d $dirname ]; then someaction; else otheraction; fi。谢谢! - Josh
这个资源似乎表明 ! 应该在单括号内。我不确定是否有共识。 - Josh
1
在方括号内,感叹号成为传递给“test”命令的布尔表达式的一部分。在方括号外,感叹号只是另一个shell(可能是内置)命令,用于否定其右侧命令的退出代码(https://dev59.com/5HRC5IYBdhLWcg3wP-Zh)。 - Neeme Praks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接