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

如何编写实现自更新文本显示的Bash脚本(类似wget进度)

在Bash脚本中实现文本同一行更新效果

嘿,这个需求我太熟悉了!要实现像wget那样在同一行实时更新文本(比如进度百分比),核心就是利用**回车符(\r)**让光标回到当前行的开头,从而覆盖掉之前的内容,而不是用换行符(\n)另起新行。下面给你几个实用的实现方案和技巧:

基础实现:简单进度更新

先从最基础的例子开始,比如循环更新百分比:

#!/bin/bash

# 模拟0到100%的进度
for progress in {0..100}; do
    # -n 让echo不自动添加换行符;-e 允许识别转义字符(比如\r)
    echo -ne "当前进度: $progress%\r"
    # 模拟耗时操作,替换成你的实际任务逻辑
    sleep 0.05
done

# 循环结束后一定要换行,避免后续命令提示符和进度内容挤在一行
echo -e "\n任务完成!"

进阶:避免残留字符(处理长文本)

如果你的更新内容长度会变化,直接用\r可能会导致旧内容的残留字符(比如之前的文本比新的长,末尾字符没被覆盖)。这时候可以结合终端宽度,用空格填满剩余行空间:

#!/bin/bash

# 获取当前终端的列数,用来计算需要填充的空格
terminal_cols=$(tput cols)

for task_num in {1..50}; do
    # 构造要显示的进度文本
    status_text="正在处理第 $task_num/50 个任务..."
    # 计算需要填充的空格数:终端列数减去文本长度
    fill_spaces=$(printf "%*s" $((terminal_cols - ${#status_text})) "")
    
    # 输出文本+空格,然后回到行首
    echo -ne "$status_text$fill_spaces\r"
    # 模拟任务耗时
    sleep 0.1
done

echo -e "\n所有任务处理完成!"

模拟下载进度(更贴近wget的效果)

如果想模仿wget的下载进度显示,我们可以加入动态的数值变化:

#!/bin/bash

# 模拟总文件大小(单位:MB)
total_size=120
downloaded=0

while [ $downloaded -lt $total_size ]; do
    # 每次随机增加1-6MB,模拟真实下载的波动
    increment=$((RANDOM % 6 + 1))
    downloaded=$((downloaded + increment))
    
    # 确保下载量不超过总大小
    if [ $downloaded -gt $total_size ]; then
        downloaded=$total_size
    fi
    
    # 计算百分比
    percent=$((downloaded * 100 / total_size))
    
    # 输出实时进度,回到行首
    echo -ne "已下载: $downloaded/$total_size MB ($percent%)\r"
    sleep 0.2
done

echo -e "\n下载完成!"

几个关键注意点

  • 部分老旧终端可能不支持\r转义,但主流终端(比如xterm、GNOME Terminal、macOS Terminal)都没问题。
  • 如果你觉得echo的参数容易搞混,也可以用printf替代,效果更稳定:比如printf "当前进度: %d%%\r" $progress。
  • 循环结束后务必添加换行,否则最后一行的进度内容会被后续的Shell提示符覆盖,显得混乱。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:21:45