如何编写Bash脚本计算命令行传入整数的平均值(保留两位小数)
嘿,我来帮你搞定这个Bash脚本的问题!虽然你还没贴出你写的错误代码,但我先给你一个符合要求的正确实现,再唠唠大家写这个脚本时最容易踩的坑,你可以对照着排查自己的问题~
正确的Bash脚本实现
下面是满足你需求的脚本,包含循环、变量使用,还做了参数合法性校验和边界处理:
#!/bin/bash # 初始化总和与计数变量,必须先设为0,否则会报错 total=0 count=0 # 循环遍历所有命令行传入的参数 for num in "$@"; do # 简单校验参数是否为整数(支持正负) if ! [[ "$num" =~ ^-?[0-9]+$ ]]; then echo "错误:'$num' 不是有效的整数,请检查参数!" exit 1 fi # 累加总和,计数加1 total=$((total + num)) count=$((count + 1)) done # 处理没有传入任何参数的情况 if [ $count -eq 0 ]; then echo "错误:请至少传入一个整数参数!" exit 1 fi # 用bc工具处理浮点除法,保留两位小数 average=$(echo "scale=2; $total / $count" | bc) # 确保输出格式严格保留两位小数(比如整数25会显示为25.00) printf "%.2f\n" "$average"
测试一下你给的例子:
# 执行脚本 ./avg.sh -50 0 50 100 # 输出:25.00
常见错误排查点
你可以对照自己的脚本,看看是不是踩了这些坑:
- 变量未初始化:如果
total或count没提前设为0,Bash会把它们当成空值,执行$((total + num))时直接报错。 - 整数除法陷阱:Bash默认只支持整数运算,如果直接写
$((total / count)),哪怕结果是小数也会被截断(比如101/4会得到25而不是25.25),必须用bc或awk这类工具处理浮点计算。 - 参数遍历错误:如果用
for num in $*而不是"$@",当参数包含特殊字符时会出问题(虽然整数参数一般不会,但"$@"是遍历所有参数的标准写法,能保证每个参数被正确识别)。 - 缺少参数校验:如果传入非整数(比如字符串、小数),脚本会直接崩溃,加个正则校验能避免这种情况。
- 输出格式不达标:如果只用
echo $average输出,当结果是整数时只会显示25而不是25.00,必须用printf "%.2f"来强制格式化。
内容的提问来源于stack exchange,提问作者twelvepac1212
相关产品推荐
相关产品推荐

