Shell脚本查找数组最小数值结果异常,求原因解析
问题原因及修复方案
你的脚本出错的核心原因是用了字符串比较而非浮点数值比较:
- Shell 的
[ "$M" \< "$small" ]语法里,<是字符串比较运算符,它会按照 ASCII 字符的顺序逐个对比内容,而非数学意义上的数值大小判断。 - 拿数组里的负数举例:字符串
-0.0082和-0.7184对比时,第二个字符0的 ASCII 码(48)比7(55)小,所以字符串比较会错误判定-0.0082“更小”,这和实际数值大小完全相反,最终导致脚本把-0.0082当成了最小值。
修复后的脚本
Shell 本身不支持浮点运算,需要借助 bc 工具来做浮点数值的比较,修改后的脚本如下:
small=99999.999 for M in "${val[@]}" do # 用bc判断数值大小,表达式成立则返回1,否则返回0 if echo "$M < $small" | bc -q | grep -q 1 then small="$M" fi done echo "最小数值:$small"
或者更简洁的写法:
small=99999.999 for M in "${val[@]}" do (( $(echo "$M < $small" | bc -q) )) && small="$M" done echo "最小数值:$small"
额外提醒:遍历数组时用 "${val[@]}" 可以避免数组元素包含空格时出现拆分错误,是更稳妥的写法。
内容的提问来源于stack exchange,提问作者Akash Mondal
相关产品推荐
相关产品推荐

