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

时间:2017-01-13 00:29:35

标签: bash

当我查看bash脚本代码时,我有时会看到|,有时会看到||,但我不知道哪个更适合。

我试图做类似的事情。

set -e;

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

if [[ ${ret} -ne 0 ]]; then
    # install ansible here
fi

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

2 个答案:

答案 0 :(得分:6)

|根本不是OR运算符。但可以使用||

which ansible || {
  true # put your code to install ansible here
}

这相当于if

if ! which ansible; then
  true # put your code to install ansible here
fi

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

答案 1 :(得分:1)

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

cat /etc/issue | less

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

touch /etc/testing || echo Did not work

对于这个,触摸命令运行或尝试运行。如果它具有非零退出状态,则双管道OR启动,并尝试执行echo命令。如果touch命令有效,则不会尝试其他选择(在这种情况下我们的echo命令)......