开了两个 teminal 窗口,一边安装程序输出了很漂亮的提示符,一边自己的脚本输出的文本一片墨蓝底白字,找不到重点信息,于是想输出带颜色的字符。
环境:
OS X 10.9.2 GNU bash, version 3.2.51(1)-release (x86_64-apple-darwin13) (测试可用)
Windows 7 x86_64 mintty 2.2.3 (x86_64-pc-cygwin) (本文的结果图来自这个环境)
Shell 使用 ANSI 转义码 (ANSI escape codes) 进行颜色输出。转义序列颜色输出表如下:
颜色 | 前景色 | 背景色 |
---|---|---|
黑色 (Black) | 30 | 40 |
红色 (Red) | 31 | 41 |
绿色 (Green) | 32 | 42 |
黄色 (Yellow) | 33 | 43 |
蓝色 (Blue) | 34 | 44 |
紫红色 (Magenta) | 35 | 45 |
青色 (Cyan) | 36 | 46 |
白色 (White) | 37 | 47 |
表中的数值对 xterm 有效,其它的终端模拟器可能显示结果有些出入。
使用 echo 示例如下:
echo -e "\033[颜色值m 文本"
这句代码中\033[
作为转义序列的开始,你也可以使用 "\e["
颜色值处设定前景色值。m
终止转义序列,后面紧跟着就是生效的文本。echo
需要 -e
来开启转义序列。可以用 printf
代替 echo
。
`printf "\e[颜色值m 文本\n" #这里加上换行符`
示例:
打印蓝色文本:
echo -e "\033[34m Hello World"
printf "\e[34m Hello World\n"
但是这样执行之后,会使得其后面的文本输出都是蓝色,连命令提示符都是蓝色。要使其返回颜色使用 \033[0m
。
如:
echo -e "\033[0m"
这样使终端恢复设置前的颜色输出。
转义序列还可以设置文本在显示屏上显示的方式,如是否加粗等,如下表:
ANSI 码 | 含义 |
---|---|
0 | 常规文本 |
1 | 粗体文本 |
4 | 含下划线文本 |
5 | 闪烁文本 |
7 | 反色(补色)文本 |
闪烁文本在任何一个终端模拟器上都不显示,只在控制台显示
使用不同的转义序列组合来达到不同的效果,如下面加上背景色的显示:
echo -e "\033[前景色值;背景色值m 文本\033[0m"
前景色值和背景色值使用分号间隔,不分先后,因为两种值的颜色范围不一样,比如 黑色
30
40
。另外分开写同样生效,如 \033[44m\033[32m
但是上表的加粗、补色等属性设置位置要变化
如:
printf "\033[1;7;41;34m红底蓝字反色文本\033[0m\n"
# 1 和 7 的位置如下,可以随便放在前景色或者背景色的位置上,效果一样
printf "\033[1;41m\033[7;34m红底蓝字反色文本\033[0m"
与加粗属性合并后,有些变化。如下表:
关闭加粗 | 颜色 | 开启加粗 | 颜色 |
---|---|---|---|
0;30 | 黑 (Black) | 1;30 | 深灰 (Dark Gray) |
0;31 | 红 (Red) | 1;31 | 深红 (Dark Red) |
0;32 | 绿 (Green) | 1;32 | 深绿 (Dark Green) |
0;33 | 黄 (Yellow) | 1;33 | 亮黄 (Yellow) |
0;34 | 蓝 (Blue) | 1;34 | 深蓝 (Dark Blue) |
0;35 | 紫红 (Magenta) | 1;35 | 暗紫红 (Dark Magenta) |
0;36 | 青 (Cyan) | 1;36 | 深青 (Dark Cyan) |
0;37 | 浅 灰 (White) | 1;37 | 白 (White) |
下面的脚本打印所有的颜色:
#!/bin/bash
# This script printf colors and codes
printf "\e\033[4;31m 浅 色\033[0m \t\t\033[1;4;31m 深 色\033[0m\n"
printf "\e[0;30;47m 黑 \e[0m 0;30m \t\e[1;30;40m 深 灰 \e[0m 1;30m\n"
printf "\e[0;31;47m 红 \e[0m 0;31m \t\e[1;31;40m 深 红 \e[0m 1;31m\n"
printf "\e[0;32;47m 绿 \e[0m 0;32m \t\e[1;32;40m 深 绿 \e[0m 1;32m\n"
printf "\e[0;33;47m 黄 \e[0m 0;33m \t\e[1;33;40m 亮 黄 \e[0m 1;33m\n"
printf "\e[0;34;47m 蓝 \e[0m 0;34m \t\e[1;34;40m 深 蓝 \e[0m 1;34m\n"
printf "\e[0;35;47m 紫红 \e[0m 0;35m \t\e[1;35;40m 暗紫红 \e[0m 1;35m\n"
printf "\e[0;36;47m 青 \e[0m 0;36m \t\e[1;36;40m 深 青 \e[0m 1;36m\n"
printf "\e[0;37;47m 浅 灰 \e[0m 0;37m \t\e[1;37;40m 白 \e[0m 1;37m\n"
结果 (Windows 7 x86_64 mintty 2.2.3 (x86_64-pc-cygwin) ):
其它示例:
黑底白字:
printf "\033[40;37m Hello World\033[0m\n"
反色白底黑字:
printf "\033[40;37;7m Hello World\033[0m\n"
printf "\033[33;44m 蓝底 黄字\033[0m\n"
printf "\033[1;33;44m 蓝底 粗黄\033[0m\n"
printf "\033[1;4;33;44m 蓝底 粗黄 下划线\033[0m\n"
除了上面的方法还可以使用 tput 命令进行控制显示输出。
原文:
http://www.bashguru.com/2010/01/shell-colors-colorizing-shell-scripts.html
参考:
[1] http://blog.csdn.net/fdipzone/article/details/9993961
[2] http://blog.chinaunix.net/uid-25365622-id-4251626.html
[3] https://en.wikipedia.org/wiki/ANSI_escape_code