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

Linux新手求助:编写avg.sh脚本计算pi程序平均运行时间

搞定avg.sh脚本:自动计算pi程序多次运行的平均耗时

嘿,作为Linux新手,这个需求其实很好实现,我给你一步步拆解,写一个清晰又健壮的脚本,你跟着做就行:

先理清楚核心逻辑

我们的脚本要做三件事:

  • 检查用户输入的运行次数是不是合法(必须是正整数)
  • 循环指定次数运行./pi,收集每次的耗时
  • 把所有耗时加起来,除以次数得到平均值,最后输出

完整脚本代码(带详细注释)

直接给你写好完整的脚本,每一行都加了注释,你能看懂每一步在干嘛:

#!/bin/bash

# 第一步:检查用户有没有传对参数
if [ $# -ne 1 ]; then
    echo "用法: $0 <运行次数>"
    echo "举个例子: ./avg.sh 10"
    exit 1  # 参数不对就退出脚本
fi

# 把用户输入的次数存到变量n里
n=$1
# 检查n是不是正整数(防止用户输入0、负数或者字母)
if ! [[ "$n" =~ ^[1-9][0-9]*$ ]]; then
    echo "哎呀,运行次数得是正整数哦,比如1、10、100这样的"
    exit 1
fi

# 检查当前目录下有没有可执行的pi程序
if [ ! -x "./pi" ]; then
    echo "出错啦!当前目录找不到能运行的pi程序,请确认它在当前文件夹,并且有执行权限(可以用chmod +x pi添加权限)"
    exit 1
fi

# 初始化总耗时为0
total_time=0

echo "开始运行pi程序$n次啦,稍等..."

# 第二步:循环运行pi程序n次
for ((i=1; i<=n; i++)); do
    # 运行pi程序,把它输出的耗时存到current_time里
    # 这里默认pi程序直接输出耗时数字(比如1.23),如果你的pi输出有其他内容,看下面的说明调整
    current_time=$(./pi)
    
    # 额外检查:确保pi输出的是合法的数字,避免异常值影响结果
    if ! [[ "$current_time" =~ ^[0-9]+(\.[0-9]+)?$ ]]; then
        echo "警告:第$i次运行pi时输出有点问题,这次结果不算啦"
        continue
    fi
    
    # 用bc命令做浮点累加(bash本身只能处理整数,所以得用bc来算小数)
    total_time=$(echo "$total_time + $current_time" | bc -l)
    echo "第$i次耗时: $current_time 秒"
done

# 第三步:计算平均耗时,保留两位小数(scale=2可以改成你想要的小数位数)
avg_time=$(echo "scale=2; $total_time / $n" | bc -l)

# 最后输出结果
echo "----------------------------------------"
echo "搞定!共运行$n次,平均耗时: $avg_time 秒"

针对pi程序输出的特殊情况调整

如果你的pi程序不是直接输出数字,而是类似这样的输出:

圆周率计算完成,耗时:1.45秒

那你需要把提取耗时的那一行改成这样,用grep和正则把数字抠出来:

current_time=$(./pi | grep -oP '耗时:\K[\d.]+')

解释一下:grep -oP用来匹配特定模式,\K表示忽略前面的内容,只保留后面的数字部分。

怎么用这个脚本?

  1. 把上面的代码复制到一个文本文件里,命名为avg.sh
  2. 打开终端,给脚本加执行权限:chmod +x avg.sh
  3. 运行脚本:./avg.sh 10(这里的10就是你要运行的次数,换成你需要的数字就行)

小提示

  • bc是Linux自带的浮点计算工具,几乎所有发行版都有,不用担心找不到
  • 如果运行时出现权限问题,记得给pi程序也加执行权限:chmod +x pi

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:01:26