linux shell彩色输出

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

转义序列

要是通过彩色化提示符来增加个性化,就要用到转义序列。 转义序列就是一个让 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
详见链接:http://www.linuxfocus.org/English/May2004/article335.shtml
~/.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:
nico@ebrain:~$




打印进度条
http://my.oschina.net/jcseg/blog/178047
1. 利用\r backspace符来制作进度条:

(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终端进度条制作完毕.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

anssummer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值