第一章: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颜色序列,你可能会想升级下,这样你就能在你的脚本中增加彩色的、有风格的输出了。
注:老七我的终端,什么也显示不了呀。