Linux Bash-a vs Bash&&;
我有一个bash声明:Linux Bash-a vs Bash&&;,linux,bash,conditional,debian-based,Linux,Bash,Conditional,Debian Based,我有一个bash声明: if ls > /dev/null 2>&1 -a ls > /dev/null 2>&1; then echo "true"; else echo "false"; fi 这给了我“假”。但我知道ls将始终返回0(即true)。我原以为-a是一个AND语句 当我将此更改为: if ls > /dev/null 2>&1 && ls > /dev/null 2>
if ls > /dev/null 2>&1 -a ls > /dev/null 2>&1; then
echo "true";
else
echo "false";
fi
这给了我“假”。但我知道ls
将始终返回0
(即true)。我原以为-a
是一个AND语句
当我将此更改为:
if ls > /dev/null 2>&1 && ls > /dev/null 2>&1; then
echo "true";
else
echo "false";
fi
它起作用了。这里发生了什么不同?
-a
不是AND运算符吗?&&
是在bash中执行短路逻辑AND的正确方法。
-a
是一个test
操作数(test
也是一个名为[
)的命令)。它不表示和在任何其他上下文中(例如,内置于bash中;它也是find
中的谓词)。此外,它还标记为“过时”;在链接页面中搜索OB
上面还说,
[-n“$foo”]&&[-n“$bar”]
,或[[$foo&$bar]
,比[-n“$foo”-a-n“$bar”]
&
是在bash中执行逻辑和短路的正确方法。
-a
是一个test
操作数(test
也是一个名为[
)的命令)。它不表示和在任何其他上下文中(例如,内置于bash中;它也是find
中的谓词)。此外,它还标记为“过时”;在链接页面中搜索OB
上面还说,
[-n“$foo”]&&&[-n“$bar”]
,或[[$foo&$bar]
,比[-n“$foo”-a-n“$bar”]
更好的实践,顺便说一句,使用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
为了简单起见,我编辑了它。顺便说一句,使用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
为了简单起见,我编辑了它。shell语法通常非常依赖于上下文。也就是说,各种符号的含义在很大程度上取决于它出现的位置。&&
在命令之间(如[-n“$foo”]&&[-n“$bar”]
)或[[]]内部表示“逻辑和”
或(())
,但不在[]
内部-a
仅当它出现在[]
内部时表示“逻辑and”(然后仅在某些位置)这只是这个上下文依赖的许多例子之一。我不太愿意调用<代码> -< /COD> shell语法——它是[[]]
或者(())
,但不是在[]
里面。”.有没有一种平易近人的方法来学习这些东西,让它看起来更有动力和说服力,而不是像我现在看到的那样让人讨厌、考虑不周、管道堵塞、难以接近的混乱局面?@Connor,…所以,你把这归因于一个做出了非常可怕的设计决策的人,而不是一个试图修复别人的人e几十年前的设计疏忽以避免向后不兼容。Bash充满了这种情况,是的,但考虑到上下文和历史,其基本原理变得不那么神秘。一般来说,shell语法非常依赖上下文。也就是说,各种符号的含义在很大程度上取决于它出现的位置。&&
意味着“逻辑and”在命令之间(如[-n“$foo”]&&-[-n“$bar”]
),或在[[]]
内部或(())
,但不在[]
内部时,-a仅在[]
内部表示“逻辑and”(然后仅在某些位置)这只是这个上下文依赖的许多例子之一。我不太愿意调用<代码> -< /COD> shell语法——它是[[]]
或者(())
,但不是在[]
".有没有一种平易近人的方法来学习这些东西,让它看起来更有动力和说服力,而不是像我现在看到的那样让人讨厌、考虑不周、管道堵塞、难以接近的混乱局面?@Connor,…所以,你把这归因于一个做出了非常可怕的设计决策的人,而不是一个试图修复别人的人是的,Bash充满了这一点,但考虑到上下文和历史,其基本原理就变得不那么神秘了。