【转】如何在Linux终端里用Shell和C输出带颜色的文字
因为写程序的需要,就查了一下shell实现彩色输出的问题,综合了两篇文章的精华,原文连接位于文章最后。文章来源网络,如果有问题请直接联系。
我们知道,使用ls命令列出文件列表时,不同的文件类型会用不同的颜色显示。那么如何实现这样带颜色的文本输出呢?答案并不复杂,不管是用shell还是C语言。
一、shell下的实现方法
先来讲在shell下,如何实现。用echo命令就可以实现,参看以下例子:
实例:echo -e "\033[0;32m Hello World. \033[0m \n"
\033 [0; 32m xxxx
| | | |
开始 属性 字体色 字符串
当你在终端里敲下这条命令后,是不是发现系统用绿色输出了"Hello,world!",不止如此,连之后的命令提示符都变成了绿色?不要着急,听我继续说。
内建命令echo 输出他的参数,以空格来分隔,以换行符来结束。返回值总为0。echo 使用的一些选项:
-e:转义反斜杠字符。
-n:禁止换行。
echo 命令使用的转义序列
序列 意义
a 闹铃
b 退格
c 强制换行
e 退出
f 清除屏幕
n 新行
r Carriage return.
t 水平制表符
v 垂直制表符
\ 反斜杠
上面例子中,echo命令-e选项的作用是激活终端对反斜线转义符(即\)的解释。引号内\033用于引导非常规字符序列,在这里的作用就是引导设置输出属性,后边的[32m就是将前景色设置为绿色,“m”意味着设置属性然后结束非常规字符序列,数字代表属性值。设置可以单独使用,例如:
echo -e "\033[0m"
这行命令的作用是恢复属性为默认值,也就是说0m设置项用于恢复默认值。现在你的终端是不是又一切正常了?
理解了这些,剩下的就简单了。用这种命令,除了设置文本前景色,还可以设置很多属性。下边列出其他的设置项:
--------------------------------------------------------------------------
\033[0m 关闭所有属性
\033[1m 设置高亮度
\033[4m 下划线
\033[5m 闪烁
\033[7m 反显
\033[8m 消隐
\033[30m 至 \33[37m 设置前景色
\033[40m 至 \33[47m 设置背景色
\033[nA 光标上移n行
\033[nB 光标下移n行
\033[nC 光标右移n行
\033[nD 光标左移n行
\033[y;xH设置光标位置
\033[2J 清屏
\033[K 清除从光标到行尾的内容
\033[s 保存光标位置
\033[u 恢复光标位置
\033[?25l 隐藏光标
\033[?25h 显示光标
--------------------------------------------------------------------------
各数字所代表的颜色如下:
前景色:30黑 31红 32绿 33黄 34蓝 35紫 36青 37白
背景色:40黑 41红 42绿 43黄 44青 45蓝 46青 47白
#前景颜色各数字是对应背景颜色减去10.
另外,同类的多种设置项可以组合在一起,中间用分号(;)隔开。如下:
echo -e "\033[20;1H\033[1;4;32mHello,world\033[0m"
这行命令首先\033[20;1H将光标移动到终端第20行第1列,之后的\033[1;4;32m将文本属性设置为高亮、带下划线且颜色为绿色,然后输出Hello,world;最后\033[0m将终端属性恢复为默认值,这样就不会看到连命令完成后的命令提示符也变了样儿了。
通过以上各种命令的组合就可以实现对终端输出地复杂控制。
二、如何在C编程中实现?
理解了以上在Shell中的实现方法,关于在C中如何实现就很简单了。可以说只需要用printf函数代替上边的echo -e就OK了。参见下例:
printf("\033[20;1H\033[1;4;32mHello, world.\033[0m");
这个例子类似上边shell中最后那个例子,另外这里颜色值也可以通过变量来指定。
三、联想
看到这里你可能会想,是不是在其他编程语言里也可以用类似的方法实现对终端输出的控制呢?答案是肯定的!比如在python中,可以如下输出:
print "\033[20;1H\033[1;4;32mHello, world.\033[0m"
这个例子的效果跟上边C的例子是相同的。
文章来源网络,如果有问题请直接联系。
原文链接地址: