转义序列
要是通过彩色化提示符来增加个性化,就要用到转义序列。 转义序列就是一个让 shell 执行一个特殊步骤的控制指令。 转义序列通常都是以 ESC 开头(这也是它的命名原因)。 在 shell 里表示为 ^[ .这种表示法需要一点时间去适应, 也可以用 \033 完成相同的工作(ESC 的 ASCII 码用十进制表示就是 27,等于用八进制表示的 033)。
例子说明
echo -e "\033[44;37;5m ME \033[0m COOL"
以上命令设置背景成为蓝色,前景白色,闪烁光标,输出字符“ME”,然后重新设置屏幕到缺省设置,输出字符 “COOL”。“e”是命令 echo 的一个可选项,它用于激活特殊字符的解析器。“\033”引导非常规字符序列。“m”意味着设置属性然后结束非常规字符序列,这个例子里真正有效的字符是 “44;37;5” 和“0”。
修改“44;37;5”可以生成不同颜色的组合,数值和编码的前后顺序没有关系。
首先我们要知道如下几张表:
前景 背景 颜色
---------------------------------------
30 40 黑色
31 41 紅色
32 42 綠色
33 43 黃色
34 44 藍色
35 45 紫紅色
36 46 青藍色
37 47 白色
1 透明色
代码 意义
-------------------------
0 OFF
1 高亮显示
4 underline
5 闪烁
7 反白显示
8 不可见
(1). 字体红色输出:
查看上面的ANSI控制码可以知道: \033[30m -- \033[37m是控制前景色, 并且红色使用31表示, 即: 红色ANSI控制码为: \033[31m
| 1 | echo -e "\33[31m红色字体\33[0m" #需要加上-e参数 |
从\033[31m处开始使用"红色"作为字体的前景色, 后面全部的绘制都使用红色, 直到遇到属性关闭控制码. 所以: 后面使用\033[0m来关闭属性, 要不然终端后面的输入的文字将全部是红色的. 效果图:
(2). 使用多个控制码产生叠加效果: 红色+高亮
| 1 | echo -e "\033[31m\033[1m红色+高亮\033[0m" #高亮控制码为: \033[1m |
效果:
(3). 红底+白字+高亮+下划线:
| 1 | echo -e "\033[41m\033[37m\033[1m\033[4m红底+白字+高亮+下划线\033[0m" |
效果:
多个控制码可以一起使用, 从而看到叠加的效果, 控制码之间的顺序无所谓, 例如: 上面的高亮和下划线. 其他的控制码就可以自己试试了.
所有情况
根据上表所有可能的颜色,用shell脚本打印所有颜色:
for attr in 0 1 4 5 7 ; do
echo "----------------------------------------------------------------"
printf "ESC[%s;Foreground;Background - \n" $attr
for fore in 30 31 32 33 34 35 36 37; do
for back in 40 41 42 43 44 45 46 47; do
printf '\033[%s;%s;%sm %02s;%02s ' $attr $fore $back $fore $back
done
printf '\n'
done
printf '\033[0m'
done
php cli使用
1.
<?php
function color_a(&$string) {
$cmd="echo -ne \"\033[31m".$string." \033[0m\n\"";
$a=exec($cmd);
print "$a"."\n";
}
function color_b(&$string) {
$cmd="printf \"\033[01;40;32m".$string."\033[0m\n\"";
$a=exec($cmd);
print "$a"."\n";
}
$string="aaaaaaaaaaaa";
color_a($string);
color_b($string);
?>结果:
# php color.php
aaaaaaaaaaaa
aaaaaaaaaaaa
2.
echo chr(27)."[0;34m".$str.chr(27)."[m\n";
应用
改变PS1
~/.bashrc: PS1="\[\033[0;37;44m\u@\033[0;32;43m\h:\033[0;33;41m\w$\033[0m\]"
This gives us a very colorful prompt:
|
打印进度条
(1). 一个php例子如下: (注意, php要使用printf, echo没用的)
1 | <?php |
2 | for ($i = 0; $i <= 50; $i++) { |
3 | printf("mprogress: %d%% %s\r", $i * 2, str_repeat('#',$i) ); |
4 | usleep(1000 * 100); |
5 | } |
6 | echo "\n", "Done.\n"; |
7 | ?> |
运行效果如下:
(2). 加上色彩:
(3). 进一步美化, 使用背景并且使用空格代替'#'字符:
1 | <?php |
2 | for ($i = 0; $i <= 50; $i++) { |
3 | printf("mprogress: \033[41m\033[1m %d%% %s\r\033[0m", $i * 2, str_repeat(' ',$i) ); |
4 | usleep(1000 * 100); |
5 | } |
6 | echo "\n", "Done.\n"; |
7 | ?> |
效果:
哈, 效果还不错呢.
(4). 终极美化, 将光标隐藏:
这个只要在里面加上隐藏光标的ANSI控制码就ok了, 不过记得要在后面将光标回复显示, 要不然后面终端就看不到光标了:
1 | <?php |
2 | for ($i = 0; $i <= 50; $i++) { |
3 | printf("\033[?25lmprogress: \033[41m\033[1m %d%% %s\r\033[0m", $i * 2, str_repeat(' ',$i) ); |
4 | usleep(1000 * 100); |
5 | } |
6 | printf("\nDone.\n\033[?25h"); |
7 | ?> |
效果:
到此Linux终端进度条制作完毕.

本文介绍如何在Linux终端中使用转义序列实现文本的彩色输出及多种样式调整,并展示了如何利用这些特性制作带有颜色和进度指示的进度条。







33万+

被折叠的 条评论
为什么被折叠?



