shell 脚本设置文本颜色

开了两个 teminal 窗口,一边安装程序输出了很漂亮的提示符,一边自己的脚本输出的文本一片墨蓝底白字,找不到重点信息,于是想输出带颜色的字符。

环境:

  1. OS X 10.9.2 GNU bash, version 3.2.51(1)-release (x86_64-apple-darwin13) (测试可用)

  2. Windows 7 x86_64 mintty 2.2.3 (x86_64-pc-cygwin) (本文的结果图来自这个环境)

Shell 使用 ANSI 转义码 (ANSI escape codes) 进行颜色输出。转义序列颜色输出表如下:

颜色前景色背景色
黑色 (Black)3040
红色 (Red)3141
绿色 (Green)3242
黄色 (Yellow)3343
蓝色 (Blue)3444
紫红色 (Magenta)3545
青色 (Cyan)3646
白色 (White)3747

表中的数值对 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) ):

Result

其它示例:

黑底白字:

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值