使用OR运算符的bash - 管道v双管道

dan*_*y74 2 bash

当我查看bash脚本代码时,我有时会看到|并且有时会看到||,但我不知道哪个更好.

我正在尝试做类似的事情......

set -e;

ret=0 && { which ansible || ret=$?; }

if [[ ${ret} -ne 0 ]]; then
    # install ansible here
fi
Run Code Online (Sandbox Code Playgroud)

请告知在此方案中首选哪个OR运算符.

iva*_*van 9

使用单管道(一个命令的管道输出用作下一个命令的输入)和过程控制 OR(双管道)之间存在很大差异。

cat /etc/issue | less
Run Code Online (Sandbox Code Playgroud)

这会在 /etc/issue 文件上运行 cat 命令,而不是立即将输出发送到 stdout,而是通过管道将其作为 less 命令的输入。是的,这不是一个很好的例子,因为您可以简单地少做 /etc/issue - 但至少您可以看到它是如何工作的

touch /etc/testing || echo Did not work
Run Code Online (Sandbox Code Playgroud)

对于此命令,将运行或尝试运行 touch 命令。如果它具有非零退出状态,则双管道 OR 启动,并尝试执行 echo 命令。如果 touch 命令有效,那么无论其他选择是什么(在本例中是我们的 echo 命令)都不会尝试......


Cha*_*ffy 6

|根本不是OR运算符.但是你可以使用||:

which ansible || {
  true # put your code to install ansible here
}
Run Code Online (Sandbox Code Playgroud)

这相当于if:

if ! which ansible; then
  true # put your code to install ansible here
fi
Run Code Online (Sandbox Code Playgroud)

顺便说一下 - 考虑养成使用type(内置shell)而不是which(外部命令)的习惯.type是更快,更好地理解shell行为:如果你有一个ansible命令,比如,一个调用真实命令的shell函数,which它将不知道它在那里,但type会正确地检测它是否可用.

  • @l'L'l,...不要对我引用 ABS。查找*真正的*参考(官方手册、bash-hackers wiki 等)。 (2认同)
  • 维护不足,充满了不良做法. (2认同)
  • @ l'L'l,那说,`||`确实是一个OR运算符,我的回答中没有任何其他说明; 这是```不是. (2认同)
  • ... re:官方手册,请访问https://www.gnu.org/software/bash/manual/ (2认同)
  • @l'L'l,...刚刚意识到我从未回答过你的问题。*官方*手册位于 https://www.gnu.org/software/bash/manual/bash.html (2认同)
  • @StefanSchmidt`命令-v ls`;更好的是它是 POSIX 所要求的,因此可以在兼容的 shell 之间移植。不过那里没有“-a”。 (2认同)