⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 colorizing.html

📁 BASH Shell 编程 经典教程 《高级SHELL脚本编程》中文版
💻 HTML
📖 第 1 页 / 共 2 页
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><HTML><HEAD><TITLE>将脚本彩色化</TITLE><METANAME="GENERATOR"CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINKREL="HOME"TITLE="高级Bash脚本编程指南"HREF="index.html"><LINKREL="UP"TITLE="杂项"HREF="miscellany.html"><LINKREL="PREVIOUS"TITLE="递归"HREF="recursionsct.html"><LINKREL="NEXT"TITLE="优化"HREF="optimizations.html"></HEAD><BODYCLASS="SECT1"BGCOLOR="#FFFFFF"TEXT="#000000"LINK="#0000FF"VLINK="#840084"ALINK="#0000FF"><DIVCLASS="NAVHEADER"><TABLESUMMARY="Header navigation table"WIDTH="100%"BORDER="0"CELLPADDING="0"CELLSPACING="0"><TR><THCOLSPAN="3"ALIGN="center">高级Bash脚本编程指南: 一本深入学习shell脚本艺术的书籍</TH></TR><TR><TDWIDTH="10%"ALIGN="left"VALIGN="bottom"><AHREF="recursionsct.html"ACCESSKEY="P">前一页</A></TD><TDWIDTH="80%"ALIGN="center"VALIGN="bottom">33. 杂项</TD><TDWIDTH="10%"ALIGN="right"VALIGN="bottom"><AHREF="optimizations.html"ACCESSKEY="N">下一页</A></TD></TR></TABLE><HRALIGN="LEFT"WIDTH="100%"></DIV><DIVCLASS="SECT1"><H1CLASS="SECT1"><ANAME="COLORIZING">33.5. 将脚本<SPANCLASS="QUOTE">"彩色化"</SPAN></A></H1><P><ANAME="COLORIZINGREF"></A></P><P>ANSI<ANAME="AEN15733"HREF="#FTN.AEN15733"><SPANCLASS="footnote">[1]</SPAN></A>定义了屏幕属性的转义序列集合, 	   比如说粗体文本, 前景与背景颜色. <AHREF="dosbatch.html#DOSBATCH1">DOS批处理文件</A>通常都使用ANSI转义码来控制 <EM>颜色</EM>输出, 	   Bash脚本也是这么做的. </P><DIVCLASS="EXAMPLE"><HR><ANAME="EX30A"></A><P><B>例子 33-11. 一个<SPANCLASS="QUOTE">"彩色的"</SPAN>地址数据库</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">#!/bin/bash# ex30a.sh: 脚本ex30.sh的"彩色"版本. #            没被加工处理过的地址数据库clear                                   # 清屏. echo -n "          "echo -e '\E[37;44m'"\033[1mContact List\033[0m"                                        # 在蓝色背景下的白色. echo; echoecho -e "\033[1mChoose one of the following persons:\033[0m"                                        # 粗体tput sgr0echo "(Enter only the first letter of name.)"echoecho -en '\E[47;34m'"\033[1mE\033[0m"   # 蓝色tput sgr0                               # 将颜色重置为"常规". echo "vans, Roland"                     # "[E]vans, Roland"echo -en '\E[47;35m'"\033[1mJ\033[0m"   # 红紫色tput sgr0echo "ones, Mildred"echo -en '\E[47;32m'"\033[1mS\033[0m"   # 绿色tput sgr0echo "mith, Julie"echo -en '\E[47;31m'"\033[1mZ\033[0m"   # 红色tput sgr0echo "ane, Morris"echoread personcase "$person" in# 注意, 变量被引用起来了.   "E" | "e" )  # 大小写的输入都能接受.   echo  echo "Roland Evans"  echo "4321 Floppy Dr."  echo "Hardscrabble, CO 80753"  echo "(303) 734-9874"  echo "(303) 734-9892 fax"  echo "revans@zzy.net"  echo "Business partner &#38; old friend"  ;;  "J" | "j" )  echo  echo "Mildred Jones"  echo "249 E. 7th St., Apt. 19"  echo "New York, NY 10009"  echo "(212) 533-2814"  echo "(212) 533-9972 fax"  echo "milliej@loisaida.com"  echo "Girlfriend"  echo "Birthday: Feb. 11"  ;;# 稍后为Smith &#38; Zane添加信息.           * )   # 默认选项. 	     # 空输入(直接按回车)也会在这被匹配.    echo   echo "Not yet in database."  ;;esactput sgr0                               # 将颜色重置为"常规". echoexit 0</PRE></FONT></TD></TR></TABLE><HR></DIV><DIVCLASS="EXAMPLE"><HR><ANAME="DRAW-BOX"></A><P><B>例子 33-12. 画一个盒子</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">#!/bin/bash# Draw-box.sh: 使用ASCII字符画一个盒子. # 由Stefano Palmeri编写, 本书作者做了少量修改. # 经过授权, 可以在本书中使用. #########################################################################  draw_box函数注释  ####  "draw_box"函数可以让用户#+ 在终端上画一个盒子. ##  用法: draw_box ROW COLUMN HEIGHT WIDTH [COLOR] #  ROW和COLUMN用来定位你想要#+ 画的盒子的左上角. #  ROW和COLUMN必须大于0, #+ 并且要小于当前终端的尺寸. #  HEIGHT是盒子的行数, 并且必须 &#62;0 . #  HEIGHT + ROW 必须 &#60;= 终端的高度. #  WIDTH是盒子的列数, 必须 &#62;0 .#  WIDTH + COLUMN 必须 &#60;= 终端的宽度. ## 例如: 如果你的终端尺寸为20x80, #  draw_box 2 3 10 45 是合法的#  draw_box 2 3 19 45 的HEIGHT是错的 (19+2 &#62; 20)#  draw_box 2 3 18 78 的WIDTH是错的 (78+3 &#62; 80)##  COLOR是盒子边框的颜色. #  这是第5个参数, 并且是可选的. #  0=黑 1=红 2=绿 3=棕褐 4=蓝 5=紫 6=青 7=白.#  如果你传递给函数的参数错误, #+ 它将会退出, 并返回65, #+ 不会有消息打印到stderr上. ##  开始画盒子之前, 会清屏. #  函数内不包含清屏命令. #  这样就允许用户画多个盒子, 甚至可以叠加多个盒子. ###  draw_box函数注释结束  ### ######################################################################draw_box(){#=============#HORZ="-"VERT="|"CORNER_CHAR="+"MINARGS=4E_BADARGS=65#=============#if [ $# -lt "$MINARGS" ]; then                 # 如果参数小于4, 退出.     exit $E_BADARGSfi# 找出参数中非数字的字符. # 还有其他更好的方法么(留给读者作为练习?). if echo $@ | tr -d [:blank:] | tr -d [:digit:] | grep . &#38;&#62; /dev/null; then   exit $E_BADARGSfiBOX_HEIGHT=`expr $3 - 1`   #  必须-1, 因为边角的"+"是BOX_WIDTH=`expr $4 - 1`    #+ 高和宽共有的部分. T_ROWS=`tput lines`        #  定义当前终端的T_COLS=`tput cols`         #+ 长和宽的尺寸.          if [ $1 -lt 1 ] || [ $1 -gt $T_ROWS ]; then    #  开始检查参数   exit $E_BADARGS                             #+ 是否正确. fiif [ $2 -lt 1 ] || [ $2 -gt $T_COLS ]; then   exit $E_BADARGSfiif [ `expr $1 + $BOX_HEIGHT + 1` -gt $T_ROWS ]; then   exit $E_BADARGSfiif [ `expr $2 + $BOX_WIDTH + 1` -gt $T_COLS ]; then   exit $E_BADARGSfiif [ $3 -lt 1 ] || [ $4 -lt 1 ]; then   exit $E_BADARGSfi                                 # 参数检查结束. plot_char(){                       # 函数内的函数.    echo -e "\E[${1};${2}H"$3}echo -ne "\E[3${5}m"               # 如果定义了, 就设置盒子边框的颜色. # 开始画盒子count=1                                         #  使用plot_char函数for (( r=$1; count&#60;=$BOX_HEIGHT; r++)); do      #+ 画垂直线.   plot_char $r $2 $VERT  let count=count+1done count=1c=`expr $2 + $BOX_WIDTH`for (( r=$1; count&#60;=$BOX_HEIGHT; r++)); do  plot_char $r $c $VERT  let count=count+1done count=1                                        #  使用plot_char函数for (( c=$2; count&#60;=$BOX_WIDTH; c++)); do      #+ 画水平线.   plot_char $1 $c $HORZ  let count=count+1done count=1r=`expr $1 + $BOX_HEIGHT`for (( c=$2; count&#60;=$BOX_WIDTH; c++)); do  plot_char $r $c $HORZ  let count=count+1done plot_char $1 $2 $CORNER_CHAR                   # 画盒子的角. plot_char $1 `expr $2 + $BOX_WIDTH` +plot_char `expr $1 + $BOX_HEIGHT` $2 +plot_char `expr $1 + $BOX_HEIGHT` `expr $2 + $BOX_WIDTH` +echo -ne "\E[0m"             #  恢复原来的颜色. P_ROWS=`expr $T_ROWS - 1`    #  在终端的底部打印提示符. echo -e "\E[${P_ROWS};1H"}      # 现在, 让我们开始画盒子吧. clear                       # 清屏. R=2      # 行C=3      # 列H=10     # 高W=45     # 宽col=1    # 颜色(红)draw_box $R $C $H $W $col   # 画盒子. exit 0# 练习:# -----# 添加一个选项, 用来支持可以在所画的盒子中打印文本. </PRE></FONT></TD></TR></TABLE><HR></DIV><P>最简单的, 也可能是最有用的ANSI转义序列是加粗文本, 		<BCLASS="COMMAND">\033[1m ... \033[0m</B>. 	  <SPANCLASS="TOKEN">\033</SPAN>代表<EM>转义</EM>, 	  <SPANCLASS="QUOTE">"[1"</SPAN>打开加粗属性, 	  而<SPANCLASS="QUOTE">"[0"</SPAN>关闭加粗属性. 	  <SPANCLASS="QUOTE">"m"</SPAN>表示转义序列结束. 	      <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">echo -e "\033[1mThis is bold text.\033[0m"</KBD>	      </PRE></FONT></TD></TR></TABLE>	</P><P>一种类似的转义序列用来切换下划线属性(在<EM>rxvt</EM> 和<EM>aterm</EM>上). 	      <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">echo -e "\033[4mThis is underlined text.\033[0m"</KBD>	      </PRE></FONT></TD></TR></TABLE>	</P><DIVCLASS="NOTE"><P></P><TABLECLASS="NOTE"WIDTH="100%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/note.gif"HSPACE="5"ALT="Note"></TD><TDALIGN="LEFT"VALIGN="TOP"><P><BCLASS="COMMAND">echo</B>命令的<CODECLASS="OPTION">-e</CODE>选项用来启用转义序列. </P></TD></TR></TABLE></DIV><P>其他的转义序列可用于修改文本和背景色. </P><P>	      <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">echo -e '\E[34;47mThis prints in blue.'; tput sgr0</KBD><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">echo -e '\E[33;44m'"yellow text on blue background"; tput sgr0</KBD><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">echo -e '\E[1;33;44m'"BOLD yellow text on blue background"; tput sgr0</KBD>	      </PRE></FONT></TD></TR></TABLE>	      </P><DIVCLASS="NOTE"><P></P><TABLECLASS="NOTE"WIDTH="100%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/note.gif"HSPACE="5"ALT="Note"></TD><TDALIGN="LEFT"VALIGN="TOP"><P>通常情况下, 为浅色的前景文本设置<EM>粗体</EM>属性比较好. 	  </P></TD></TR></TABLE></DIV><P><BCLASS="COMMAND">tput sgr0</B>把终端设置恢复为原样. 		如果省略这一句, 那么这个终端所有后续的输出还会是蓝色. 	        </P><DIVCLASS="NOTE"><P></P><TABLECLASS="NOTE"WIDTH="100%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/note.gif"HSPACE="5"ALT="Note"></TD><TDALIGN="LEFT"VALIGN="TOP"><P>因为<BCLASS="COMMAND">tput sgr0</B>在某些环境下不能恢复终端设置, 		<BCLASS="COMMAND">echo -ne \E[0m</B>可能是更好的选择. </P></TD></TR></TABLE></DIV><TABLECLASS="SIDEBAR"BORDER="1"CELLPADDING="5"><TR><TD><DIVCLASS="SIDEBAR"><P></P><ANAME="AEN15783"></A><P>可以在有色的背景上, 使用下面的模板, 在上面写有色的文本. 	</P><P>	  <KBDCLASS="USERINPUT">echo -e '\E[COLOR1;COLOR2mSome text goes here.'</KBD>        </P><P><SPANCLASS="QUOTE">"\E["</SPAN>开始转义序列. 	  以分号分隔的数字<SPANCLASS="QUOTE">"COLOR1"</SPAN>和<SPANCLASS="QUOTE">"COLOR2"</SPAN>分别指定了前景色和背景色, 	  数值与色彩之间的对应, 请参考下面的表格. (数值的顺序其实没关系, 	  因为前景色和背景色的数值都落在互不重叠的范围中.) 	  <SPANCLASS="QUOTE">"m"</SPAN>用来终止转义序列, 	  文本紧跟在<SPANCLASS="QUOTE">"m"</SPAN>的后面. 	  </P><P>也要注意, <AHREF="varsubn.html#SNGLQUO">单引号</A>将<BCLASS="COMMAND">echo -e</B>后面的命令序列都引用了起来. 	  </P><P></P></DIV></TD></TR></TABLE><P>下表的数值是在<EM>rxvt</EM>终端上运行的结果. 		具体的结果可能和在其他终端上运行的结果不同. 	  </P><DIVCLASS="TABLE"><HR><ANAME="AEN15798"></A><P><B>表格 33-1. 转义序列中颜色与数值的对应</B></P><TABLEBORDER="1"CLASS="CALSTABLE"><COL><COL><COL><THEAD><TR><TH>颜色</TH><TH>前景</TH><TH>背景</TH></TR></THEAD><TBODY><TR><TD><CODECLASS="OPTION">黑</CODE></TD><TD>30</TD><TD>40</TD></TR><TR><TD><CODECLASS="OPTION">红</CODE></TD><TD>31</TD><TD>41</TD></TR><TR><TD><CODECLASS="OPTION">绿</CODE></TD><TD>32</TD><TD>42</TD></TR><TR><TD

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -