第一章:The Missing Code Library--11.ANSI颜色序列

   尽管你可能还没有意识到,可你的标准终端应用是能够支持不同的文本风格。大量不同的风格是可能的,不管你是想要在你的脚本中让特定的词使用粗体,还是在一个黄色背景下使用红色字体。使用ANSI(美国国家标准化组织)序列来表现这些不同风格是有难度的,因为这些序列对于用户而言并不是很友好的。因此,这个脚本部分生成了一系列的变量来表示ANSI码,这样就可以用它们来决定是否使用不同的颜色和格式。

代码:

#!/bin/sh

# ANSIColor.sh -- 使用下面的变量表示不同的颜色
# 和格式。以f结尾的词表示文本颜色。
# 以b结尾的词表示背景色。

initializeANSI()
{
    esc="\033"     # 如果这个不能运行,就直接输入一个ESC

    blackf="${esc}[30m";   redf="${esc}[31m";    greenf="${esc}[32m" 
    yellowf="${esc}[33m"   bluef="${esc}[34m";   purplef="${esc}[35m" 
    cyanf="${esc}[36m";    whitef="${esc}[37m" 

    blackb="${esc}[40m";   redb="${esc}[41m";    greenb="${esc}[42m" 
    yellowb="${esc}[43m"   blueb="${esc}[44m";   purpleb="${esc}[45m" 
    cyanb="${esc}[46m";    whiteb="${esc}[47m" 

    boldon="${esc}[1m";    boldoff="${esc}[22m" 
    italicson="${esc}[3m"; italicsoff="${esc}[23m" 
    ulon="${esc}[4m";      uloff="${esc}[24m" 
    invon="${esc}[7m";     invoff="${esc}[27m" 

    reset="${esc}[0m" 
}

initializeANSI 

cat <<EOF
${yellowf}This is a phrase in yellow${redb} and red${reset}
${boldon}This is bold${ulon} this is italics${reset} bye bye
${italicson}This is italics${italicsoff} and this is not
${ulon}This is ul${uloff} and this is not
${invon}This is inv${invoff} and this is not
${yellowf}${redb}Warning I ${yellowb}${redf}Warning II${reset}
EOF

脚本如何工作:
如果你习惯了HTML,你可能会觉得这些序列看起来有点违和。在HTML中,你开、关修饰词的顺序是相反的,你必须先关掉每一个你打开的修饰符。所以,为了生成斜粗体字,在HTML中你需要键入:

<b>this is in bold and <i>this is italics</i> within the bold</b>

    关闭了粗体标签,而没有关闭斜体的话,会引起严重的问题,甚至会让某些Web浏览器崩溃。但是如果使用ANSI颜色序列的话,部分修饰符替换掉之前的修饰符,而且所有的修饰符都被关掉了,仅仅是使用一个单独的重置序列。要用ANSI序列,你就必须要确保对于任何你打开的东西,颜色和“off”特性后要输入重置序列。该脚本中使用变量定义,你会像下面几行一样写之前的序列:

$(boldon)this is in bold and ${italicson}this is
italics${italicsoff}within the bold${reset}

运行脚本:
我们需要初始化所有的ANSI序列,然后输出一些不同颜色和风格的语句:

initializeANSI 

cat <<EOF
${yellowf}This is a phrase in yellow${redb} and red${reset}
${boldon}This is bold${ulon} this is italics${reset} bye bye
${italicson}This is italics${italicsoff} and this is not
${ulon}This is ul${uloff} and this is not
${invon}This is inv${invoff} and this is not
${yellowf}${redb}Warning I ${yellowb}${redf}Warning II${reset}
EOF

运行结果:
结果的外观并不令人觉得有多振奋,但是在一个支持这些色彩序列的显示器上,它一定能引起你的注意。

分析脚本:
使用这个脚本时,如果你看到了下面这行输出:

\033[33m\033[41mWarning I \033[43m\033[31mWarning II\033[0m

如果你看到了(悲剧,),说明你的终端并不支持ANSI颜色序列,但也有可能是系统不认识作为ESC标记符的\033。要纠正这个错误,用vi编辑器或别的你喜爱用的打开脚本,然后用^V替换\033,然后按下ESC键。你应该会看到^[显示出来,所以在显示屏上的结果看起来是"^[",这样就OK了。如果,从另一方面来说,你的终端并不支持ANSI颜色序列,你可能会想升级下,这样你就能在你的脚本中增加彩色的、有风格的输出了。

注:老七我的终端,什么也显示不了呀。

 

 

 

 

 

 

 

posted @ 2012-12-12 11:52  十舍七匹狼  阅读(137)  评论(0编辑  收藏  举报