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
(或 0
或 null
等)视为特殊的 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。
所以在我的 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
(或 0
或 null
等)视为特殊的 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。