第一种实现方式
#!/bin/bash
i=0
str='#'
ch=('|' '\' '-' '/')
index=0
while [ $i -le 25 ]
do
printf "[%-25s][%d%%][%c]\r" $str $(($i*4)) ${ch[$index]}
str+='#'
let i++
let index=i%4
sleep 0.1
done
printf "\n"
echo "安装完成"
执行效果

第二种方式
#!/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
执行效果

第三种方式
#!/bin/bash
trap 'onCtrlC' INT
function onCtrlC () {
#捕获CTRL+C,当脚本被ctrl+c的形式终止时同时终止程序的后台进程
kill -9 ${do_sth_pid} ${progress_pid}
echo
echo 'Ctrl+C 中断进程'
exit 1
}
start() {
#运行的主程序,每次休眠8 防止cpu过高
sleep 8
}
progress() {
#进度条程序
local main_pid=$1
local length=20
local ratio=1
#主进程不等于1 就一直循环,直至Ctr c 结束
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.2
done
}
start &
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"
执行效果
