1、进度条的代码以及展示
事情起源于今天的巡检脚本时间太长,不知是死是活,所以用一下进度条,没有花里胡哨的,都是一看就懂的那种代码。
1、证明自己还活着的信息
下面是代码
[root@slave1 ~]# cat c.sh
#!/bin/bash
progress(){
i=1
s=1
b='/'
while [ $s -eq 1 ]
do
printf "please wait %s \r" $b
sleep 0.3
let c=$i%4
let i+=1
case $c in
0) b="/";;
1) b="-";;
2) b="\\";;
3) b="|";;
esac
let x+=1
done
}
progress &
sleep 10
sh /root/d.sh
[root@slave1 ~]# cat d.sh
#!/bin/bash
kill -9 `ps -aux | grep c.sh | grep -v grep | awk '{print $2}'`
为什么要写两个脚本,因为kill这条命令我放到c.sh的脚本的最后,但是我发现他并没有完全杀死这个后天的进程,所以我就把kill命令放到了另外一个文件中。
2、第二种显示
[root@slave1 ~]# cat a.sh
#!/bin/bash
processBar()
{
process=$1
whole=$2
printf "[%03d/%03d]\r" $process $whole
}
whole=100
process=0
while [ $process -lt $whole ]
do
let process++
processBar $process $whole
sleep 0.1
done
printf "\n"
3、第三种显示
[root@slave1 ~]# cat pro1.sh
# !/bin/bash
# progress.sh: show how to make a char progress bar
b=""
for((i=0;i<=100;i+=2))
do
printf "progress: [%-50s] %d%%\r" $b $i
sleep 0.2
b+='#'
done
echo
2、核心内容解释
1、\r的讲解
以上三种进度条都有一个共同的核心就是"\r",\r是一种可以让光标显示到这一行的行首,所以当你显示别的内容时就覆盖了之前的,举个例子:
[root@slave1 ~]# vi test1.sh
#!/bin/bash
printf "我今天好好学习了\r"
sleep 10
printf "ni\r"
sleep 30
printf "\n"
开始执行就输出,我今天要好好学习了。
sleep10秒以后你会发现,我变成了ni,其他不变,这是因为位数太短没有全部覆盖。
2、[ ] 100% 介绍
首先看一下单独执行printf “progress: [%-50s] %d%%” 有什么效果。
可以看出这只是要输出我们想要的长度而已,下一步去一点点覆盖。那么如何把这个###写进去。printf "progress: [%-50s] %d%%\r" $b $i
'printf "中%-50s和%d是一个占位符,执行脚本结束,$b的内容会替代%-50s, $i会替代%d,而%%在printf中才能输出一个%。