Bash中使用bc进行数值区间比较失效,求问题排查与解决
问题分析与修复
你的代码存在几个核心错误,导致无论输入什么值都不会触发条件:
1. case语句用法完全错误
case的逻辑是拿第一个参数(你这里写的是1)去匹配后面的模式,你把bc的输出直接放在模式位置,逻辑完全不对。而且bc执行后返回0(假)或1(真),和你设定的匹配目标1无法对应,所以永远不会触发任何分支。
2. bc的比较表达式语法错误
bc不支持a >= b >= c这种连续比较写法,必须拆成逻辑与/或的表达式。比如要判断11.25 ≤ foo ≤33.75,得写成$foo >= 11.25 && $foo <= 33.75。另外你第一个条件11.25 > $foo >= 348.25逻辑本身矛盾,没有任何数能同时满足“小于11.25”且“大于等于348.25”。
3. 逻辑需求的表述偏差
你说要实现“小于等于33.75 或 大于等于11.25”,这其实是所有实数都满足的条件,显然不符合你的实际需求——结合你提到foo=31.26时希望第二个条件为真,你实际应该是想判断foo在11.25到33.75之间(包含边界),以及foo小于11.25或大于348.25这两个区间。
修复后的代码
浮点数比较不适合用case,用if结合bc更直观:
foo="31.26" # 判断是否在11.25~33.75之间 if (( $(bc <<< "$foo >= 11.25 && $foo <= 33.75") )); then echo "do something" # 判断是否小于11.25或大于348.25 elif (( $(bc <<< "$foo < 11.25 || $foo >= 348.25") )); then echo "do something" fi
如果你的需求确实是“小于等于33.75 或 大于等于11.25”(所有数值都会触发),代码可以简化为:
foo="31.26" if (( $(bc <<< "$foo <= 33.75 || $foo >= 11.25") )); then echo "do something" fi
补充说明
bc返回1代表条件为真,0为假,用(( ... ))可以把这个返回值作为Bash的布尔判断依据。- Bash原生不支持浮点数比较,必须借助
bc或awk这类工具实现。
内容的提问来源于stack exchange,提问作者Jiess
相关产品推荐
相关产品推荐

