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

Bash ternary operation gives same output on either Boolean condition

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

我的示例代码如下所示:

[[ $LOG_TO_TERMINAL ]] && echo "error message" >> $LOG_FILE || echo "error message" | tee -a $LOG_FILE

无论我将 LOG_TO_TERMINAL 设置为 true 还是 false,它都只是记录文件而不是回显到终端。

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

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

但是这个代码片段也回显了 "log to terminal" 不管它的值是什么。

你想要这个:

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

测试[[ $LOG_TO_TERMINAL ]]测试LOG_TO_TERMINAL是否有值。没有其他的。 shell 不会将 false(或 0null 等)视为特殊的 false-y 值。

如果您想进行其他测试,则需要专门为此进行测试。

[[ $LOG_TO_TERMINAL = true ]]

[[ $LOG_TO_TERMINAL != false ]]

[[ $LOG_TO_TERMINAL = 1 ]]

等等

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

另请注意,X && Y || Z 不是 shell 中的三元运算。有关此的更多信息,请参阅 Shellcheck wiki 的警告 SC2015