无需额外插件的Bash脚本进度条实现方案及示例
无需额外插件的Bash备份脚本进度条实现
作为脚本编写新手,我希望给自己的Linux备份Bash脚本添加进度条功能,但要求不能让用户安装任何额外插件。我了解pv工具可以实现进度更新,但它需要提前安装,不符合我的需求。请问是否可以实现类似Linux系统更新或安装应用时的那种进度条?
经过尝试,我找到了一个对新手友好的可行方法,只需在输出结束状态消息前添加以下进度条代码(测试场景下可用):
# 进度条 echo -n 'Progress: [--------------------]' sleep 1 # <- 此处替换为实际执行的命令1 echo -ne '\rProgress: [#####---------------]' sleep 1 # <- 此处替换为实际执行的命令2 echo -ne '\rProgress: [##########----------]' sleep 1 # <- 此处替换为实际执行的命令3 echo -ne '\rProgress: [###############-----]' sleep 1 # <- 此处替换为实际执行的命令4 echo -e '\rProgress: [####################]'
这个方法在测试场景中效果很好,希望能帮助其他有同样需求的人。下面是整合了该进度条逻辑的完整备份脚本(针对tar备份做了适配,让进度条随备份进程更新):
#!/bin/bash ### 标题: 归档备份脚本 ### 日期: 2022年7月16日 ### 作者: CJG ### 版本: 1.0.0 # 要备份的文件夹路径(可修改为目标文件夹) backup_files="/home/" # 备份目标路径(请勿使用/tmp,否则系统重启后备份文件会被删除) dest="/tmp" # 创建记录开始和结束时间的变量 # date命令会在调用now变量时获取当前时间 # %H 格式化显示小时 # %M 格式化显示分钟 # %S 格式化显示秒数 now=$(date +"%H:%M:%S") # 创建归档文件名 currentDate=$(date +"%y-%m-%d") hostname=$(hostname -s) archive_file="$hostname-$currentDate.tgz" # 提示备份进程启动 echo "正在备份 $backup_files 到 $dest/$archive_file" echo "进程已启动。" # 打印开始时间 echo 脚本启动时间: "$now" # 启动tar备份并放入后台执行 tar -czPf $dest/$archive_file $backup_files & backup_pid=$! # 显示进度条 echo -n '备份进度: [--------------------]' # 循环检测备份进程是否在运行,更新进度条 progress=0 while kill -0 $backup_pid 2>/dev/null; do # 根据进度值更新进度条样式 case $progress in 0) echo -ne '\r备份进度: [#####---------------]' ;; 1) echo -ne '\r备份进度: [##########----------]' ;; 2) echo -ne '\r备份进度: [###############-----]' ;; 3) echo -ne '\r备份进度: [####################]' ;; esac progress=$(( (progress + 1) % 4 )) sleep 1 done # 确保进度条显示完成状态 echo -e '\r备份进度: [####################]' # 打印结束状态消息 echo "备份完成" now=$(date +"%H:%M:%S") echo 脚本结束时间: "$now"
内容的提问来源于stack exchange,提问作者Cege
相关产品推荐
相关产品推荐

