当我查看bash脚本代码时,我有时会看到|并且有时会看到||,但我不知道哪个更好.
我正在尝试做类似的事情......
set -e;
ret=0 && { which ansible || ret=$?; }
if [[ ${ret} -ne 0 ]]; then
# install ansible here
fi
Run Code Online (Sandbox Code Playgroud)
请告知在此方案中首选哪个OR运算符.
使用单管道(一个命令的管道输出用作下一个命令的输入)和过程控制 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 命令)都不会尝试......
|根本不是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会正确地检测它是否可用.