Bash脚本除法结果为0异常及安卓应用平均CPU利用率计算问题
解决Bash脚本计算安卓应用平均CPU利用率结果为0的问题
我来帮你分析下问题所在,以及怎么修复这个脚本:
问题根源
- 变量名笔误:你计算平均值时写的是
totalMemory / counter,但实际累加CPU值的变量是total_cpu,这个错误会导致你用未初始化的totalMemory(默认值为0)做除法,结果自然为0。 - 累加变量未初始化:脚本开头没有给
total_cpu赋值,第一次循环时total_cpu=$((total_cpu + current_cpu))会把total_cpu当作0处理,后续计算也会基于错误的初始值。 - Bash不支持浮点数运算:
adb shell top输出的CPU利用率通常带小数(比如2.3%),你去掉%后得到的是浮点数,但Bash的$((...))仅支持整数运算,会直接截断小数部分。如果CPU利用率小于1(比如0.7%),会被当成0处理,累加后总和始终为0,除法结果自然是0。
修复后的脚本
我们可以借助bc工具处理浮点数运算,同时修正变量问题:
#!/bin/bash counter=1 total_cpu=0 # 初始化累加变量 while [ $counter -le 10 ] do # 提取CPU利用率,保留小数部分 current_cpu=$(adb shell top -n 1 | grep org.carleton.iot.mobile_cep | awk '{print $5}' | sed 's|%||g') echo "current_cpu = $current_cpu" # 用bc进行浮点数累加 total_cpu=$(echo "$total_cpu + $current_cpu" | bc -l) echo "total_cpu = $total_cpu" echo "counter = $counter" # 用bc计算平均值,保留两位小数(可按需调整scale值) average_cpu=$(echo "scale=2; $total_cpu / $counter" | bc -l) echo "average_cpu = $average_cpu" echo "" ((counter++)) sleep 1 done echo done
关键改动说明
- 初始化
total_cpu=0,避免未定义变量的计算错误; - 用
bc -l替代Bash原生整数运算,支持浮点数的累加与除法,scale=2用来指定结果保留两位小数; - 修正平均值计算的变量名错误,将
totalMemory改为正确的total_cpu。
额外提示:如果top输出格式不同,$5可能不是CPU利用率的列,建议先单独执行adb shell top -n 1 | grep org.carleton.iot.mobile_cep确认列位置,确保awk取到正确的数值。
内容的提问来源于stack exchange,提问作者Amarjit Dhillon
相关产品推荐
相关产品推荐

