您的位置:首页 > 运维架构 > Shell

在linux下用c和shell编写彩色进度条

2017-07-15 17:14 246 查看
进度条

显示在屏幕上的进度条一般分为三部分

1. 显示已经执行了多少

2. 执行多少占的百分比

3. 一个转盘

先来说一下普通的进度条

对于显示执行多少,一般都会预留100个空间,每0.1秒完成1%

对于执行占的百分比,用循环i来实现,每循环一次,i+1,刚好是循环占的百分比

对于转盘,用一个数组实现,数组中有四个元素\ | - /,当这四个元素依次循环时,出现一个简单的转盘。

实现进度条

先用C实现

#include<stdio.h>
#include<unistd.h>
#include<string.h>

int main()
{
int i = 0;
char str[100];  //进度条一般都是百分制,所以定义100个空间
memset(str, '\0', sizeof(str)/sizeof(char)); //先将所有的都赋值为\0,打印出来就是空
char tmp[4] = {'-', '\\', '|', '/'};

for(; i<=100; i++)
{
str[i] = '#';
color=30+i%8;
printf("[%-101s][%d%%][%c]", str, i, tmp[i%4]);
printf("\r");
fflush(stdout);  //刷新输出
usleep(50000);
}
printf("\n");
return 0;
}


为什么要用\r,而不用\n呢?

\n有两个作用,刷新,换行。在进度条里并不需要换行,只需要刷新,所以使用\r。

用shell脚本实现

#!/bin/bash

i=0
lable=('|' '\\' '-' '/')

while [ $i -le 100 ]
do
printf "[%-100s][%d%%][%c]\r" "$str" "$i" "${lable[$i%4]}"
str='#'$str
sleep 0.1
let i++
done
printf "\n"


shell脚本实现思想和C实现是一样的,只要遵循shell的语法规则就可以了。

实现彩色进度条

下面介绍一下实现彩色进度条。

已经实现了普通进度条,再来实现彩色进度条,只要掌握了配色规则,实现起来是相当的容易。

先说一下配色的规则。

\033[0m 关闭所有属性

\033[1m 设置高亮度

\033[4m 下划线

\033[5m 闪烁

\033[7m 反显

\033[8m 消隐

\033[30m – \033[37m 设置前景色

\033[40m – \033[47m 设置背景色

\033[nA 光标上移n行

\033[nB 光标下移n行

\033[nC 光标右移n列

\033[nD 光标左移n列

\033[y;H 设置光标位置

\033[2J 清屏

\033[K 清除从光标到行尾的内容

\033[s 保存光标位置

\033[u 恢复光标位置

\033[?25l 隐藏光标

\033[?25h 显示光标

\033也可以换成\e

文字背景色彩数字: (颜色范围:40 - 49)

40: 黑色

41: 深红色

42: 绿色

43: 黄色

44: 蓝色

45: 紫色

46: 深绿色

47: 白色

(3). 文字前景色数字: (颜色范围: 30 - 39)

30: 黑色

31: 红色

32: 绿色

33: 黄色

34: 蓝色

35: 紫色

36: 深绿色

37: 白色

举个例子就能清楚的看到怎么使用了



如果只是单次使用,在语句的最后一定要加上\e[0m,将配色清除,变为原来的配色方案。

C实现彩色进度条

#include<stdio.h>
#include<unistd.h>
#include<string.h>
int main()
{
int color=0;
int i = 0;
char str[102];
memset(str, '\0', sizeof(str)/sizeof(char));
char tmp[4] = {'-', '\\', '|', '/'};
for(; i<=100; i++)
{
str[i] = '#';
color=30+i%8;
printf("\e[5m\e[%dm[%-101s][%d%%][%c]\e[0m",color, str, i, tmp[i%4]);
printf("\r");
fflush(stdout);
usleep(50000);
}
printf("\n");
return 0;
}


Shell实现彩色进度条

#!/bin/bash

i=0
lable=('|' '\\' '-' '/')

while [ $i -le 100 ]
do
let indexcolor=i%8
let color=30+indexcolor;
printf "\e[5m\e[${color}m[%-100s][%d%%][%c]\e[0m\r" "$str" "$i" "${lable[$i%4]}"
str='#'$str
sleep 0.1
let i++
done
printf "\n"


\e[5m设置为闪烁,\e[${color}m设置字体的颜色,随着i的变化,字体颜色也会发生改变。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: