介绍了Shell脚本实现进度条的两种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
1、脚本中各模块(或函数)运行过程可以量化,则可以直接使用带百分比的进度条。
#!/bin/bash
mark=''
for ((ratio=0;${ratio}<=100;ratio+=5))
do
sleep 0.2
printf "progress:[%-40s]%d%%\r" "${mark}" "${ratio}"
mark="##${mark}"
done
echo
进度条中’#'的数量和进度条长度成正比,printf打印每次只回车不换行,新的异常打印会覆盖之前的打印
2、有些情况下你也许不知道程序什么时候结束,只是需要一个动态的进度条来表示程序正在运行,比如进度条由[----------]变成[>---------],进度条里面的-不断被>替换,当所有的-都被替换后所有符号又重新变成-,直到程序结束运行。
#!/bin/bash
trap 'onCtrlC' INT
function onCtrlC () {
#捕获CTRL+C,当脚本被ctrl+c的形式终止时同时终止程序的后台进程
kill -9 ${do_sth_pid} ${progress_pid}
echo
echo 'Ctrl+C is captured'
exit 1
}
do_sth() {
#运行的主程序
sleep 10
}
progress() {
#进度条程序
local main_pid=$1
local length=20
local ratio=1
while [ "$(ps -p ${main_pid} | wc -l)" -ne "1" ] ; do
mark='>'
progress_bar=
for i in $(seq 1 "${length}"); do
if [ "$i" -gt "${ratio}" ] ; then
mark='-'
fi
progress_bar="${progress_bar}${mark}"
done
printf "Progress: ${progress_bar}\r"
ratio=$((ratio+1))
#ratio=`expr ${ratio} + 1`
if [ "${ratio}" -gt "${length}" ] ; then
ratio=1
fi
sleep 0.1
done
}
do_sth &
do_sth_pid=$(jobs -p | tail -1)
progress "${do_sth_pid}" &
progress_pid=$(jobs -p | tail -1)
wait "${do_sth_pid}"
printf "Progress: done \n"