scriptanalysis.html
来自「BASH Shell 编程 经典教程 《高级SHELL脚本编程》中文版」· HTML 代码 · 共 294 行
HTML
294 行
<!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="exercises.html"><LINKREL="PREVIOUS"TITLE="练习"HREF="exercises.html"><LINKREL="NEXT"TITLE="编写脚本"HREF="writingscripts.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="exercises.html"ACCESSKEY="P">前一页</A></TD><TDWIDTH="80%"ALIGN="center"VALIGN="bottom">Appendix M. 练习</TD><TDWIDTH="10%"ALIGN="right"VALIGN="bottom"><AHREF="writingscripts.html"ACCESSKEY="N">下一页</A></TD></TR></TABLE><HRALIGN="LEFT"WIDTH="100%"></DIV><DIVCLASS="SECT1"><H1CLASS="SECT1"><ANAME="SCRIPTANALYSIS">M.1. 分析脚本</A></H1><P>检查下面的脚本. 运行它, 然后解释一下这个脚本是做什么用的. 注释这个脚本, 并以更紧凑和更优雅的形式重写它. </P><P> <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 #!/bin/bash 2 3 MAX=10000 4 5 6 for((nr=1; nr<$MAX; nr++)) 7 do 8 9 let "t1 = nr % 5" 10 if [ "$t1" -ne 3 ] 11 then 12 continue 13 fi 14 15 let "t2 = nr % 7" 16 if [ "$t2" -ne 4 ] 17 then 18 continue 19 fi 20 21 let "t3 = nr % 9" 22 if [ "$t3" -ne 5 ] 23 then 24 continue 25 fi 26 27 break # 当你注释掉这行, 会发生什么? 为什么? 28 29 done 30 31 echo "Number = $nr" 32 33 34 exit 0</PRE></FONT></TD></TR></TABLE> </P><P>---</P><P>解释一下下面脚本的作用. 事实上它只是一个参数化的命令行管道. </P><P> <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 #!/bin/bash 2 3 DIRNAME=/usr/bin 4 FILETYPE="shell script" 5 LOGFILE=logfile 6 7 file "$DIRNAME"/* | fgrep "$FILETYPE" | tee $LOGFILE | wc -l 8 9 exit 0</PRE></FONT></TD></TR></TABLE> </P><P>---</P><P>一个读者发来了如下的代码片断. <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 while read LINE 2 do 3 echo $LINE 4 done < `tail -f /var/log/messages`</PRE></FONT></TD></TR></TABLE> 他希望编写一个脚本, 用来跟踪系统日志文件(<TTCLASS="FILENAME">/var/log/messages</TT>)的更新情况. 不幸的是, 上面的这段代码会被挂起, 并且不会做任何有意义的事情. 为什么? 修复它, 让这个脚本如期望般的运行. (小提示: 不要<AHREF="redircb.html#REDIRREF">重定向循环的<TTCLASS="FILENAME">stdin</TT></A>, 试试<AHREF="special-chars.html#PIPEREF">管道</A>. )</P><P>---</P><P>分析<AHREF="contributed-scripts.html#LIFESLOW">例子 A-10</A>, 然后简化它, 使其逻辑性更好. 看看可以省掉多少个变量, 尝试优化这个脚本, 并提高这个脚本的运行速度. </P><P>修改这个脚本, 让它可以接受任意的ASCII文本文件作为输入, 用于它初始的"产生". 这个脚本将读取最初的<CODECLASS="VARNAME">$ROW*$COL</CODE>字符, 并且设置元音的出现次数作为<SPANCLASS="QUOTE">"活的"</SPAN>细胞. 提示: 必须保证将输入文件中的空格转换为下划线. </P></DIV><DIVCLASS="NAVFOOTER"><HRALIGN="LEFT"WIDTH="100%"><TABLESUMMARY="Footer navigation table"WIDTH="100%"BORDER="0"CELLPADDING="0"CELLSPACING="0"><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top"><AHREF="exercises.html"ACCESSKEY="P">前一页</A></TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="index.html"ACCESSKEY="H">首页</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top"><AHREF="writingscripts.html"ACCESSKEY="N">下一页</A></TD></TR><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top">练习</TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="exercises.html"ACCESSKEY="U">上一级</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top">编写脚本</TD></TR></TABLE></DIV></BODY></HTML>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?