如何在BASH中仅当三个变量中仅有一个为True时返回True?
解决三个布尔变量仅一个为True的逻辑表达式问题
嘿,先看你给出的真值表,你要的是**恰好有一个变量为1(True)**时返回True,其他情况都返回False对吧?先说说你当前写的代码问题:你那行条件( $a == 1 || $b == 1 || $c == 1 ) && ( $a == 1 && $b == 1 && $c == 1 ),其实是在判断“至少一个为True 并且 三个全为True”,也就是只有三个变量都为1的时候才会成立,这和你想要的逻辑完全相反啦。
正确的逻辑表达式推导
咱们要的是“恰好一个变量为1”,可以拆成三种互斥的情况,把它们用逻辑或(||)连起来就行:
- a为1,同时b和c都是0
- b为1,同时a和c都是0
- c为1,同时a和b都是0
对应到shell的条件表达式就是:
if [[ ( $a == 1 && $b == 0 && $c == 0 ) || ( $b == 1 && $a == 0 && $c == 0 ) || ( $c == 1 && $a == 0 && $b == 0 ) ]]; then return 0 # 注意:shell里用0表示True/成功状态,非0表示False/失败 fi
更简洁的算术写法
其实在shell里,布尔值可以直接当作数字计算,恰好一个为1的话,三个变量的和肯定是1。所以可以用更简洁的写法:
if [[ $((a + b + c)) -eq 1 ]]; then return 0 fi
这个写法不仅简洁,还完全匹配你的真值表:
- 当只有一个变量为1时,总和是1 → 满足条件返回True
- 其他情况(总和为0、2、3)都不满足,返回False
对应真值表验证一下
咱们对着你给的真值表逐条核对:
- 1 1 1 → 总和3 → 返回False ✔️
- 1 1 0 → 总和2 → 返回False ✔️
- 1 0 1 → 总和2 → 返回False ✔️
- 1 0 0 → 总和1 → 返回True ✔️
- 0 1 1 → 总和2 → 返回False ✔️
- 0 1 0 → 总和1 → 返回True ✔️
- 0 0 1 → 总和1 → 返回True ✔️
- 0 0 0 → 总和0 → 返回False ✔️
完全符合你的需求哦~
内容的提问来源于stack exchange,提问作者karmax
相关产品推荐
相关产品推荐

