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."
修复说明
- 初始化三个分类计数变量为0,确保计数运算正常;
- 修正分类条件逻辑,设置合理的距离范围(可根据实际需求调整);
- 统一变量名,计数和输出使用同一变量,避免不匹配;
- 替换
test命令为更常用的[]语法,保持代码风格一致。
内容的提问来源于stack exchange,提问作者Jawaher Al_makhmari
相关产品推荐
相关产品推荐

