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 就行了, 会替换掉之前的日志,看上去就是动态变化的一样。