当前位置: 技术问答>linux和unix
shell脚本实现“显示命令执行进度”
来源: 互联网 发布时间:2016-08-07
本文导语: 上网看到这样一段代码: 使用方法就是:xxx.sh file.tar 在解压文件的时候会给出解压进度 #!/bin/bash if [ $# -ne 1 ]; then echo "Usage: $0 file" exit 1 fi TSIZE=0 for FSIZE in $(tar tvvf $1 | awk '{pr...
上网看到这样一段代码:
使用方法就是:xxx.sh file.tar
在解压文件的时候会给出解压进度
下面这句存在疑问,不知实现的原理是什么:
echo -e "e[Ae[${PROG_POS}G${PROGRESS}=>"
上网查了一下,-e表示开启转义,e会打印出ESC字符,曾经看过e[30m可以改变终端颜色,但后面跟个[A是做什么呢?
${PROG_POS}是个数字,这里是13,那e[13G,后面再跟一个字符窜是什么意思呢?
请大家帮忙分析下,谢谢了~
使用方法就是:xxx.sh file.tar
在解压文件的时候会给出解压进度
#!/bin/bash
if [ $# -ne 1 ]; then
echo "Usage: $0 file"
exit 1
fi
TSIZE=0
for FSIZE in $(tar tvvf $1 | awk '{print $3}'); do
if [ "$FSIZE" = "${FSIZE//[^0-9]/}" ]; then
TSIZE=$((TSIZE+FSIZE))
fi
done
[ $TSIZE -eq 0 ] && exit 1
MSG="Extracting..."
PROG_POS=$((${#MSG}+1))
PERC_POS=$((${#MSG}+53))
echo $MSG
PREV=-1
NSIZE=0
for FSIZE in $(tar xvvf $1 | awk '{print $3}'); do
if [ "$FSIZE" = "${FSIZE//[^0-9]/}" ]; then
NSIZE=$((NSIZE+FSIZE))
PERCENT=$((NSIZE*100/TSIZE))
if [ $PERCENT -ne $PREV ]; then
PLUS=$((PERCENT/2))
PROGRESS=$(printf "%.${PLUS}d" | tr '0' '+')
echo -e "e[Ae[${PROG_POS}G${PROGRESS}=>"
echo -e "e[Ae[${PERC_POS}G${PERCENT}%"
PREV=$PERCENT
fi
fi
done
下面这句存在疑问,不知实现的原理是什么:
echo -e "e[Ae[${PROG_POS}G${PROGRESS}=>"
上网查了一下,-e表示开启转义,e会打印出ESC字符,曾经看过e[30m可以改变终端颜色,但后面跟个[A是做什么呢?
${PROG_POS}是个数字,这里是13,那e[13G,后面再跟一个字符窜是什么意思呢?
请大家帮忙分析下,谢谢了~
|
${PROG_POS}是个数字,这里是13,那e[13G,后面再跟一个字符窜是什么意思呢
这个我知道 从第13个位置开始输出 结合你的代码 echo -e "e[Ae[${PROG_POS}G${PROGRESS}=>" 就是在第13开始输出${PROGRESS}=> 而${PROGRESS}是+号 所以就是输出+=>
echo -e "e[Ae[${PERC_POS}G${PERCENT}%"
这一句e[${PERC_POS}G是从PERC_POS的位置开始输出 从代码上边来看 是PROG_POS+2的位置 而${PERCENT}%是百分比 所以就是在PROG_POS+2位置开始输出进度的百分比 即+=>之后 +=>x%
这个我知道 从第13个位置开始输出 结合你的代码 echo -e "e[Ae[${PROG_POS}G${PROGRESS}=>" 就是在第13开始输出${PROGRESS}=> 而${PROGRESS}是+号 所以就是输出+=>
echo -e "e[Ae[${PERC_POS}G${PERCENT}%"
这一句e[${PERC_POS}G是从PERC_POS的位置开始输出 从代码上边来看 是PROG_POS+2的位置 而${PERCENT}%是百分比 所以就是在PROG_POS+2位置开始输出进度的百分比 即+=>之后 +=>x%
|
e[A 这个的意思 虽然我不敢确认
但是我在CentOS里做了测试 发现它有在同一行输出的意思
见下面代码
#!/bin/bash
a="1 2 3 4 5 6 7 8 9"
for b in $a
do
echo -e "e[Ae[${b}G${b}"
done
echo -e "e[Ae[${b}G${b}"的意思是在第b位输出b
而输出的结果确是是
123456789
但是我在CentOS里做了测试 发现它有在同一行输出的意思
见下面代码
#!/bin/bash
a="1 2 3 4 5 6 7 8 9"
for b in $a
do
echo -e "e[Ae[${b}G${b}"
done
echo -e "e[Ae[${b}G${b}"的意思是在第b位输出b
而输出的结果确是是
123456789
|
我查了半天也没查到