Shell中实现进度条or打印动态变量

printf 使用

shell中的打印除了echo外,大多都是用printf来实现的, 它功能比较强大,更适合用来打印日志,来看看它都有哪些用法吧。

printf  format-string  [arguments...]

这里只列出转义字符的一些用法,通过它可以实现我们后续的问题。

转义符 描述
\b 删除前一个字符
\f 换页符,在某些实现中会清屏,有些会换行
\n 换行
\r 从行头开始,和换行不一样,仍在本行
\t Tab键(制表符)
\v 竖直tab(垂直制表符),和 \f 相似,不同的机器显示有所不同,通常会引起换行 VERTICAL TAB 或 CTRL-K
\ 打印一个反斜杠 “\”
\a 发出警告音
 打印双引号

 

进度条

默认情况下printf是不会换行打印的,只会append到打印过的字符后面,所以我们直接打印即可。

declare -i progress=0;
printf "[="
while [ $progress -lt 100 ];do
    printf "="
    sleep 0.02
done
printf "=]100%"

或者

ProgressBar()
{
  local current=$1; local total=$2
  local now=$((current*100/total))
  local last=$(((current-1)*100/total))
  [[ $((last % 2)) -eq 1 ]]&&let last++
  local str=$(for i in `seq 1 $((last/2))`; do printf '#'; done)
  for ((i=$last;$i<=$now;i+=2));do printf "\r[%-50s]%d%%" "$str"  $i;sleep 0.02;str+='#';done
}
for  n in `seq 1 100`
  do
  ProgressBar $n 100
  done
echo

 

动态变量

declare -i num=0;
while true;do
    printf "\r%d" $num 
    num=$((num+1))
    sleep 1
done

 直接用 \r 就行了, 会替换掉之前的日志,看上去就是动态变化的一样。

 

 

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

Scroll to Top