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

Shell脚本变量计算异常:乘客分类统计模块无输出排查

问题:Bash脚本乘客分类统计失效,输出为空

我写了一个Bash脚本,用来统计乘客的总出行距离、平均距离,以及按出行距离分类的乘客数量,但分类统计的代码块始终无法正确计算,相关输出为空。以下是完整脚本、异常代码块和运行输出,请帮忙排查错误。

完整脚本

#!/bin/bash

total=0

for i in 1 2 3 4
do
    echo -n "Enter Passenger Name: "
    read pname
    
    echo -n "Enter Car Number: "
    read ncar

    echo -n "Enter Amount: "
    read amount

    echo -n "Enter Distance Travelled: "
    read dtravelled

    total=$((total + dtravelled))

    average=$(echo "$total 4" | awk '{print $1/$2}')

    if test $dtravelled -gt 10000 -a $dtravelled -le 7000
    then
        bpassenger=$((business_pass + 1))
    elif test $dtravelled -gt 7000 -a $dtravelled -le 5000
    then
        lpassenger=$((leisure_pass + 1))
    else
        opassenger=$((other_pass + 1))
    fi

    if test $i -eq 1
    then
        lname=$pname
        low=$dtravelled
    fi

    if test $dtravelled -lt $low
    then
        lname=$pname
        low=$dtravelled
    fi
    
    echo
done

echo "Total of distance travelled by the passengers: $total"
echo "Average distance travelled by the passengers: $average"
echo "Number of business passengers: $bpassenger"
echo "Number of leisure passengers: $lpassenger"
echo "Number of other passengers: $opassenger"
echo "lowest distance travelled is $low by $lname."

异常代码块(未执行正确计算)

以下代码块始终输出空值

if test $dtravelled -gt 10000 -a $dtravelled -le 7000
then
    bpassenger=$((business_pass + 1))
elif test $dtravelled -gt 7000 -a $dtravelled -le 5000
then
    lpassenger=$((leisure_pass + 1))
else
    opassenger=$((other_pass + 1))
fi

运行输出

bash mySript.sh

Enter Passenger Name: ahmad
Enter Car Number: 9889
Enter Amount: 20
Enter Distance Travelled: 1100

Enter Passenger Name: sara
Enter Car Number: 5214
Enter Amount: 300
Enter Distance Travelled: 1120

Enter Passenger Name: mohammad
Enter Car Number: 9713
Enter Amount: 6
Enter Distance Travelled: 500

Enter Passenger Name: nora
Enter Car Number: 98765
Enter Amount: 41
Enter Distance Travelled: 7500

Total of distance travelled by the passengers: 10220
Average distance travelled by the passengers: 2555
Number of business passengers: 
Number of leisure passengers: 
Number of other passengers: 1
lowest distance travelled is 500 by mohammad.

错误原因分析

  • 条件逻辑完全矛盾:第一个if的条件$dtravelled -gt 10000 -a $dtravelled -le 7000,没有任何数能同时大于10000且小于等于7000;第二个elif的$dtravelled -gt 7000 -a $dtravelled -le 5000同理,逻辑完全错误,导致这两个分支永远不会被触发,所有数据都进入else分支。
  • 计数变量未初始化:business_pass、leisure_pass、other_pass三个变量未初始化为0,直接进行$((business_pass + 1))运算时,未定义的变量会被当作0,但后续赋值给bpassenger等变量时,初始值为空,最终输出空值。
  • 变量名不匹配:计数时使用的是business_pass,但输出的是bpassenger,变量名不一致,即使条件正确,也无法输出正确结果。

修复后的脚本

#!/bin/bash

total=0
# 初始化计数变量
business_pass=0
leisure_pass=0
other_pass=0

for i in 1 2 3 4
do
    echo -n "Enter Passenger Name: "
    read pname
    
    echo -n "Enter Car Number: "
    read ncar

    echo -n "Enter Amount: "
    read amount

    echo -n "Enter Distance Travelled: "
    read dtravelled

    total=$((total + dtravelled))

    average=$(echo "$total 4" | awk '{print $1/$2}')

    # 修正条件逻辑,设置合理的分类范围
    if [ $dtravelled -gt 7000 ]; then
        business_pass=$((business_pass + 1))
    elif [ $dtravelled -gt 5000 ] && [ $dtravelled -le 7000 ]; then
        leisure_pass=$((leisure_pass + 1))
    else
        other_pass=$((other_pass + 1))
    fi

    if [ $i -eq 1 ]; then
        lname=$pname
        low=$dtravelled
    fi

    if [ $dtravelled -lt $low ]; then
        lname=$pname
        low=$dtravelled
    fi
    
    echo
done

echo "Total of distance travelled by the passengers: $total"
echo "Average distance travelled by the passengers: $average"
echo "Number of business passengers: $business_pass"
echo "Number of leisure passengers: $leisure_pass"
echo "Number of other passengers: $other_pass"
echo "lowest distance travelled is $low by $lname."

修复说明

  1. 初始化三个分类计数变量为0,确保计数运算正常;
  2. 修正分类条件逻辑,设置合理的距离范围(可根据实际需求调整);
  3. 统一变量名,计数和输出使用同一变量,避免不匹配;
  4. 替换test命令为更常用的[]语法,保持代码风格一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 04:15:42