You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shell脚本BMI计算器报错求助:[: missing `]`及计算结果异常

BMI计算器Shell脚本问题排查与修复

问题1:if语句语法错误([: missing \]``)

  • 错误原因:
    • [ ](test命令)内部不支持直接使用管道|执行bc,语法不符合shell规则。
    • 逻辑与需用&&而非&,&是后台运行命令的符号,不是逻辑判断运算符。
    • bc的比较结果返回1代表真、0代表假,但shell中命令返回值0才是执行成功,需对应调整判断逻辑。
  • 修复方式:用命令替换$(...)执行bc的比较,判断返回值是否为1,同时用&&连接两个条件:
    if [ $(echo "$height > 0" | bc) -eq 1 ] && [ $(echo "$weight > 0" | bc) -eq 1 ]
    

问题2:BMI计算结果始终为0

  • 错误原因:
    • 赋值语句BMI="$weight/($height*$height)" | bc逻辑错误,管道仅传递输出流,不会将bc的计算结果赋值给BMI,变量仍保留初始值0。
    • bc默认执行整数除法,直接计算会丢失小数精度,需启用浮点运算模式。
  • 修复方式:用命令替换$(...)捕获bc的计算结果,添加-l参数启用浮点运算,同时用scale设置小数位数:
    BMI=$(echo "scale=2; $weight/($height*$height)" | bc -l)
    
    其中scale=2表示保留2位小数,可按需调整。

问题3:其他潜在优化点

  • 初始值赋值冗余:weight="0"等初始定义可省略,read命令会直接覆盖变量值。
  • 可补充非数字输入验证:若用户输入非数字内容,bc会报错,可额外添加输入格式校验(可选)。

完整修正后的代码

# --------------------BMI calculator---------------------
echo "Welcome to BMI calculator"
echo "Please enter your weight in kilograms: "
read weight
echo "Please enter your height in meters: "
read height

if [ $(echo "$height > 0" | bc) -eq 1 ] && [ $(echo "$weight > 0" | bc) -eq 1 ]
then
    BMI=$(echo "scale=2; $weight/($height*$height)" | bc -l)
    echo "Your BMI is $BMI"
else
    echo "Invalid inputs!!"
fi

内容的提问来源于stack exchange,提问作者Rajvardhan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 16:05:28