【问题标题】:Bash -a vs bash && [duplicate]Bash -a vs bash && [重复]
【发布时间】:2018-06-21 15:04:20
【问题描述】:

我有这个 bash 声明:

if ls > /dev/null 2>&1 -a ls > /dev/null 2>&1; then
    echo "true"; 
else 
    echo "false"; 
fi

这给了我“假”。但我知道ls 将始终返回0(即正确)。我原以为-a 是一个 AND 语句。

当我将其更改为:

if ls > /dev/null 2>&1 && ls > /dev/null 2>&1; then
    echo "true"; 
else 
    echo "false"; 
fi

它有效。这里有什么不同? -a 不是 AND 运算符吗?

【问题讨论】:

  • 顺便说一句,使用grep -q "state UP" 效率更高,而不用打扰>/dev/null。当grep 知道您不需要输出时,它 (1) 不会费心编写它,即使是在它被扔掉的/dev/null; (2) 可以在看到匹配项后立即退出,无需读取输入流的其余部分。
  • @CharlesDuffy 感谢您在grep -q "state UP" 上的注释,我将在未来使用它。对于将来发现此问题的任何人,此问题曾经有此命令:ip link show eth1 | grep "state UP" > /dev/null 2>&1 为了简单起见,我将其编辑了。

标签: linux bash conditional debian-based


【解决方案1】:

&& 是在 bash 中执行短路逻辑与的正确方法。

-a 是 test 操作数(test 是命令,也称为 [)。它在任何其他上下文中并不意味着 AND(内置于 bash;它 是 也是 find 中的谓词,例如)。此外,the POSIX specification for test 已将其标记为“已过时”;在链接页面中搜索OB。

上面也是说[ -n "$foo" ] && [ -n "$bar" ],或者[[ $foo && $bar ]],比[ -n "$foo" -a -n "$bar" ]好实践。

【讨论】:

  • shell 语法通常是非常依赖于上下文的。也就是说,各种符号的含义在很大程度上取决于它出现的位置。 && 在命令之间(如在[ -n "$foo" ] && [ -n "$bar" ] 中)或在[[ ]] 或(( )) 内部时表示“逻辑与”,但在[ ] 内部不是。 -a 表示“逻辑与”仅出现在 [ ] 内部(然后仅出现在某些位置)。这只是这种上下文相关性的众多示例之一。
  • 我对调用-a shell 语法感到犹豫——它是test 规范的一部分,而不是shell command language 的一部分,而&& 是 i> 该语言的一部分。
  • 我不反对,但我认为这种区别是我所说的上下文相关性的一部分。
  • 正是这种事情让我讨厌 bash:“或在 [[ ]] 或 (( )) 内部,但不在 [ ] 内部”。有没有一种平易近人的方法来学习这些东西,让它看起来有动力和有说服力,而不是像我现在觉得的那种可憎的、考虑不周的、用胶带粘住的、难以接近的烂摊子?
  • @Connor, ...因此,您对某人做出真正可怕的设计决策的评价是某人试图修复他人几十年前的设计疏忽以一种避免向后不兼容的方式。 Bash 充满了这一点,是的,但考虑到上下文和历史,基本原理变得不那么神秘了。
猜你喜欢
  • 2010-09-24
  • 1970-01-01
  • 2017-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 2016-11-11
相关资源
最近更新 更多