原文地址:https://www.iflei.com/linux-terminal-color-progress-bar.html
之前的一篇文章介绍了 Linux 系统调用和行缓冲,并且实现了一个简单的进度条程序。这篇文章将会实现一个彩色的进度条程序。
Linux终端色彩打印
ANSI 属性控制码
\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 显示光标
文字颜色数字: (颜色范围: 30 - 37)
30: 黑色 31: 红色 32: 绿色 33: 黄色
34: 蓝色 35: 紫色 36: 青色 37: 白色
文字背景色数字: (颜色范围:40 - 47)
40: 黑色 41: 红色 42: 绿色 43: 黄色
44: 蓝色 45: 紫色 46: 青色 47: 白色
属性码演示:
红色+高亮
echo -e "\033[31m\033[1m红色+高亮\033[0m"
绿底+白字+下划线
echo -e "\033[42m\033[37m\033[4m绿底+白字+下划线\033[0m"
Linux 终端彩色进度条
版本一
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#include <stdio.h>
#include <unistd.h>
int
main
(
)
{
char
buffer
[
52
]
=
{
'\0'
}
;
char
ch
[
]
=
{
'|'
,
'/'
,
'-'
,
'\\'
}
;
int
i
=
0
;
while
(
i
<=
50
)
{
printf
(
"\033[?25l"
)
;
//隐藏光标
printf
(
"\033[41m"
)
;
//红色背景
printf
(
"%c %d%%%s\r\033[0m"
,
ch
[
i
%
4
]
,
i
*
2
,
buffer
)
;
fflush
(
stdout
)
;
usleep
(
150000
)
;
buffer
[
i
]
=
' '
;
i
++
;
}
printf
(
"\n\033[?25h"
)
;
//显示光标
return
0
;
}
|
演示效果如下:
版本二
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
#include <stdio.h>
#include <unistd.h>
int
main
(
)
{
char
buffer
[
52
]
=
{
'\0'
}
;
char
ch
[
]
=
{
'|'
,
'/'
,
'-'
,
'\\'
}
;
printf
(
"\033[?25l\033[41m"
)
;
printf
(
"%69s\r"
)
;
fflush
(
stdout
)
;
printf
(
"\033[0m"
)
;
int
i
=
0
;
while
(
i
<=
50
)
{
printf
(
"\033[42m\033[1m"
)
;
printf
(
"[%c]%s%3d%% \r\033[0m"
,
ch
[
i
%
4
]
,
buffer
,
i
*
2
)
;
fflush
(
stdout
)
;
usleep
(
150000
)
;
buffer
[
i
]
=
' '
;
i
++
;
}
printf
(
"\033[32m\033[58C OK\033[0m"
)
;
printf
(
"\n\033[?25h"
)
;
return
0
;
}
|
演示效果如下: