如何在Shell中通过逻辑或运算将布尔结果赋值给变量?
在Shell中实现布尔值的逻辑或并赋值给变量
看起来你是想把两个函数返回的布尔字符串("true"/"false")做逻辑或运算,再把结果存到变量里。先说说你现有代码的问题:variable=$variable || function argument2`` 这行其实是把$variable当作命令去执行,然后用shell的命令级逻辑或||来决定是否执行第二个函数,最后把最后执行的命令的输出(而不是逻辑或的结果)赋值给variable——这显然和你想要的逻辑不符。
下面给你两种靠谱的解决方案,根据你的函数返回方式选:
情况1:你的函数返回字符串"true"或"false"
如果函数是通过标准输出返回布尔字符串,那可以直接基于字符串判断来实现逻辑或:
方式1:分步清晰版
# 先获取第一个函数的结果 variable=$(function argument1) # 执行第二个函数并保存结果 second_result=$(function argument2) # 逻辑或:只要其中一个是"true",结果就是"true" if [ "$variable" = "true" ] || [ "$second_result" = "true" ]; then variable="true" else variable="false" fi
方式2:一行精简版
如果想写得更紧凑,可以用命令替换结合条件表达式:
variable=$([ "$(function argument1)" = "true" ] || [ "$(function argument2)" = "true" ] && echo "true" || echo "false")
解释一下:
- 先判断第一个函数的返回值是否为"true",是的话整个条件为真,执行
echo "true" - 如果第一个不是,再判断第二个函数的返回值,是的话同样输出"true"
- 两个都不是的话,输出"false",最终把这个输出赋值给
variable
情况2:改成用退出码返回布尔值(更符合Shell习惯)
其实在Shell脚本里,通常用命令的退出状态码来表示布尔逻辑:返回0代表成功(对应"true"),返回非0代表失败(对应"false")。如果能把你的函数改成这种方式,代码会更简洁:
比如你的函数可以写成这样:
function my_function { # 这里写你的判断逻辑 if [ 你的条件成立 ]; then return 0 # 表示"true" else return 1 # 表示"false" fi }
然后实现逻辑或并赋值:
# 执行两个函数,保存各自的退出码 my_function argument1 code1=$? my_function argument2 code2=$? # 逻辑或:只要有一个退出码是0,结果就是"true" if [ $code1 -eq 0 ] || [ $code2 -eq 0 ]; then variable="true" else variable="false" fi
如果不需要保留两个函数的执行结果,只是要逻辑或的最终布尔字符串,也可以简化成:
# 强制执行两个函数(即使第一个已经返回true),然后判断结果 my_function argument1 my_function argument2 # 只要有一个成功,变量设为true variable=$([ $? -eq 0 ] || [ $? -eq 0 ] && echo "true" || echo "false")
这样就完美实现了你想要的:执行带argument2的函数,和原变量做逻辑或,把结果赋值给变量。
内容的提问来源于stack exchange,提问作者Андрей Ка
相关产品推荐
相关产品推荐

