Bash三元运算在任一布尔条件下都给出相同的输出

Bash三元运算在任一布尔条件下都给出相同的输出,bash,ternary,Bash,Ternary,所以在我的bash脚本中,我将状态报告输出到终端,并将其写入日志文件。我想使用一个bash三元运算符,如果变量log_to_terminal为true,它将输出到终端并写入日志文件,如果设置为false,只需写入日志文件而不向终端输出状态 我的示例代码如下所示: [[ $LOG_TO_TERMINAL ]] && echo "error message" >> $LOG_FILE || echo "error message" | tee -a $LOG_FILE

所以在我的bash脚本中,我将状态报告输出到终端,并将其写入日志文件。我想使用一个bash三元运算符,如果变量
log_to_terminal
为true,它将输出到终端并写入日志文件,如果设置为false,只需写入日志文件而不向终端输出状态

我的示例代码如下所示:

[[ $LOG_TO_TERMINAL ]] && echo "error message" >> $LOG_FILE || echo "error message" | tee -a $LOG_FILE
它只记录文件而不回显到终端,无论我是将
LOG\u设置为\u terminal
设置为
true
还是
false

为了隔离问题,我尝试将代码简化为:

[[ $LOG_TO_TERMINAL ]] && echo "log to terminal" || echo "don't log to terminal"
但此代码段也会回显“登录到终端”,无论其值是什么。

您希望这样:

[[ $LOG_TO_TERMINAL = 1 ]] && echo "log to terminal" || echo "don't log to terminal"

测试
[[$LOG\u TO_TERMINAL]]
测试
LOG\u TO_TERMINAL
是否有值。没有别的了。shell不会将
false
(或
0
null
等)视为特殊的false-y值

如果你想要一些其他的测试,你需要专门为此进行测试

[[ $LOG_TO_TERMINAL = true ]]

等等

如果您希望使用
true
和/或
false
命令的返回代码,那么您需要
$LOG_to_TERMINAL&&Y|Z
或类似的代码来运行存储在变量中的命令(尽管我不推荐此测试的此版本)


还要注意,
X&&Y | | Z
不是shell中的三元操作。有关这方面的更多信息,请参阅Shellcheck wiki以获取警告。

谢谢。所以看起来应该避免使用
A和&B|C
。那么,“如果还有别的”是我的最佳选择吗?另外,我还有另一行
[[-f$FILE]]|{echo“$FILE not found”| tee-a$LOG_FILE;exit}
。这个代码应该很好,对吧?如果您了解它的实际行为,可以使用
A&&B|C
。例如,在您的情况下,这是非常好的,因为
echo
应该永远不会失败,但您不能将其用作
可以失败和可能失败的东西。是的,第二个例子很好,因为这只是一个
A | | B
案例(其中
B
是一个命令列表)。
[[ $LOG_TO_TERMINAL != false ]]
[[ $LOG_TO_TERMINAL = 1 ]]