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

📄 assortedtips.html

📁 BASH Shell 编程 经典教程 《高级SHELL脚本编程》中文版
💻 HTML
📖 第 1 页 / 共 3 页
字号:
 33&nbsp;#  ----- 34&nbsp;#  修改这个脚本, 使其能够让LETTERSET作为命令行参数.  35&nbsp;#  将第11 - 13行的过滤器参数化(比如, 可以使用变量$FILTER),  36&nbsp;#+ 这样我们就可以根据传递的参数来指定功能.  37&nbsp; 38&nbsp;#  可以参考脚本agram2.sh,  39&nbsp;#+ 与这个例子稍微有些不同. </PRE></FONT></TD></TR></TABLE><HR></DIV><P>也请参考<AHREF="procref1.html#CONSTAT">例子 27-3</A>, <AHREF="textproc.html#CRYPTOQUOTE">例子 12-22</A>, 和<AHREF="contributed-scripts.html#SOUNDEX">例子 A-9</A>. </P></LI><LI><P>使用<SPANCLASS="QUOTE">"<AHREF="here-docs.html#ANONHEREDOC0">匿名的here	    document</A>"</SPAN>来注释代码块, 		这样就不用在每个注释行前面都加上<SPANCLASS="TOKEN">#</SPAN>了. 		请参考<AHREF="here-docs.html#COMMENTBLOCK">例子 17-11</A>. </P></LI><LI><P>如果一个脚本的运行依赖于某个命令, 			而且这个命令没被安装到运行这个脚本的机器上, 			那么在运行的时候就会产生错误. 	    我们可以使用<AHREF="filearchiv.html#WHATISREF">whatis</A>命令来避免这种可能产生的问题. 	    </P><P>	    <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;CMD=command1                 # 第一选择.   2&nbsp;PlanB=command2               # 如果第一选择不存在就选用这个.   3&nbsp;  4&nbsp;command_test=$(whatis "$CMD" | grep 'nothing appropriate')  5&nbsp;#  如果在系统中没找到'command1',   6&nbsp;#+ 那么'whatis'将返回"command1: nothing appropriate."  7&nbsp;#  8&nbsp;#  另一种更安全的做法是:   9&nbsp;#     command_test=$(whereis "$CMD" | grep \/) 10&nbsp;#  但是下面的测试条件应该反过来,  11&nbsp;#+ 因为变量$command_test只有在$CMD存在于系统上的时候,  12&nbsp;#+ 才会有内容.  13&nbsp;#     (感谢, bojster.) 14&nbsp; 15&nbsp; 16&nbsp;if [[ -z "$command_test" ]]  # 检查命令是否存在.  17&nbsp;then 18&nbsp;  $CMD option1 option2       #  使用选项来调用command1.  19&nbsp;else                         #  否则, 20&nbsp;  $PlanB                     #+ 运行command2.   21&nbsp;fi</PRE></FONT></TD></TR></TABLE>          </P></LI><LI><P>在错误的情况下, 		<AHREF="testconstructs.html#IFGREPREF">if-grep test</A>可能不会返回期望的结果, 		因为出错文本是输出到<TTCLASS="FILENAME">stderr</TT>上, 		而不是<TTCLASS="FILENAME">stdout</TT>. 	      <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;if ls -l nonexistent_filename | grep -q 'No such file or directory'  2&nbsp;  then echo "File \"nonexistent_filename\" does not exist."  3&nbsp;fi</PRE></FONT></TD></TR></TABLE></P><P>将<TTCLASS="FILENAME">stderr</TT><AHREF="io-redirection.html#IOREDIRREF">重定向</A>到<TTCLASS="FILENAME">stdout</TT>上, 就可以解决这个问题. 	      <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;if ls -l nonexistent_filename 2&#62;&#38;1 | grep -q 'No such file or directory'  2&nbsp;#                             ^^^^  3&nbsp;  then echo "File \"nonexistent_filename\" does not exist."  4&nbsp;fi  5&nbsp;  6&nbsp;# 感谢, Chris Martin指出这一点.</PRE></FONT></TD></TR></TABLE></P></LI><LI><P><AHREF="extmisc.html#RUNPARTSREF">run-parts</A>命令可以很方便的依次运行一组命令脚本, 			尤其是和<AHREF="system.html#CRONREF">cron</A>或<AHREF="timedate.html#ATREF">at</A>组合使用的时候. </P></LI><LI><P>如果可以在shell脚本中调用X-Windows的小工具, 那该有多好. 			目前已经有一些工具包可以完成这种功能, 			比如<EM>Xscript</EM>, 			<EM>Xmenu</EM>,			和<EM>widtools</EM>. 			头两种工具包已经不再被维护了. 	    幸运的是, 我们还可以从<AHREF="http://www.batse.msfc.nasa.gov/~mallozzi/home/software/xforms/src/widtools-2.0.tgz"TARGET="_top">这里</A>下载第三种工具包, 	    <EM>widtools</EM>. 	    </P><DIVCLASS="CAUTION"><P></P><TABLECLASS="CAUTION"WIDTH="90%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/caution.gif"HSPACE="5"ALT="Caution"></TD><TDALIGN="LEFT"VALIGN="TOP"><P>要想使用<EM>widtools</EM>(widget 				tools)工具包, 必须先安装<EM>XForms</EM>库. 	    除此之外, 在典型的Linux系统上编译之前, 需要正确的编辑它的<AHREF="filearchiv.html#MAKEFILEREF">Makefile</A>. 	    最后, 在提供的6个部件中, 有3个不能工作(事实上, 会产生段错误). </P></TD></TR></TABLE></DIV><P><ANAME="DIALOGREF"></A></P><P><EM>dialog</EM>工具集提供了一种从shell脚本中调用<SPANCLASS="QUOTE">"对话框"</SPAN>窗口部件的方法.  The		  原始的<BCLASS="COMMAND">dialog</B>工具包只能工作在文本的控制台模式下, 		  但是后续的类似工具, 比如<BCLASS="COMMAND">gdialog</B>,	    <BCLASS="COMMAND">Xdialog</B>, 和<BCLASS="COMMAND">kdialog</B>都是基于X-Windows窗口部件集合的. </P><DIVCLASS="EXAMPLE"><HR><ANAME="DIALOG"></A><P><B>例子 33-19. <BCLASS="COMMAND">从shell脚本中调用窗口部件</B></B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;#!/bin/bash  2&nbsp;# dialog.sh: 使用'gdialog'窗口部件.   3&nbsp;# 必须在你的系统上安装'gdialog'才能运行这个脚本.   4&nbsp;# 版本1.1 (04/05/05最后修正)  5&nbsp;  6&nbsp;# 这个脚本的灵感来源于下面的文章.   7&nbsp;#     "Scripting for X Productivity," by Marco Fioretti,  8&nbsp;#      LINUX JOURNAL, Issue 113, September 2003, pp. 86-9.  9&nbsp;# 感谢你们, 所有的LINUX JOURNAL好人.  10&nbsp; 11&nbsp; 12&nbsp;# 在对话框窗口中的输入错误.  13&nbsp;E_INPUT=65 14&nbsp;# 输入窗口的显示尺寸.  15&nbsp;HEIGHT=50 16&nbsp;WIDTH=60 17&nbsp; 18&nbsp;# 输出文件名(由脚本名构造).  19&nbsp;OUTFILE=$0.output 20&nbsp; 21&nbsp;# 将脚本的内容显示到文本窗口中.  22&nbsp;gdialog --title "Displaying: $0" --textbox $0 $HEIGHT $WIDTH 23&nbsp; 24&nbsp; 25&nbsp; 26&nbsp;# 现在, 我们将输入保存到文件中.  27&nbsp;echo -n "VARIABLE=" &#62; $OUTFILE 28&nbsp;gdialog --title "User Input" --inputbox "Enter variable, please:" \ 29&nbsp;$HEIGHT $WIDTH 2&#62;&#62; $OUTFILE 30&nbsp; 31&nbsp; 32&nbsp;if [ "$?" -eq 0 ] 33&nbsp;# 检查退出状态码, 是一个好习惯.  34&nbsp;then 35&nbsp;  echo "Executed \"dialog box\" without errors." 36&nbsp;else 37&nbsp;  echo "Error(s) in \"dialog box\" execution." 38&nbsp;        # 或者, 点"Cancel"按钮, 而不是"OK".  39&nbsp;  rm $OUTFILE 40&nbsp;  exit $E_INPUT 41&nbsp;fi 42&nbsp; 43&nbsp; 44&nbsp; 45&nbsp;# 现在, 我们将重新获得并显示保存的变量.  46&nbsp;. $OUTFILE   # 'Source'(执行)保存的文件.  47&nbsp;echo "The variable input in the \"input box\" was: "$VARIABLE"" 48&nbsp; 49&nbsp; 50&nbsp;rm $OUTFILE  # 清除临时文件.  51&nbsp;             # 某些应用可能需要保留这个文件.  52&nbsp; 53&nbsp;exit $?</PRE></FONT></TD></TR></TABLE><HR></DIV><P>其他在脚本中使用窗口部件的工具, 	    比如<EM>Tk</EM>或<EM>wish</EM>	    (<EM>Tcl</EM>派生物), 	    <EM>PerlTk</EM>(带有Tk扩展的Perl), 	    <EM>tksh</EM>(带有Tk扩展的ksh), 		<EM>XForms4Perl</EM>(带有XForms扩展的Perl), 		<EM>Gtk-Perl</EM>(带有Gtk扩展的Perl), 		或<EM>PyQt</EM>(带有Qt扩展的Python). </P></LI><LI><P>为了对复杂脚本做多次的修正, 	    可以使用<EM>rcs</EM>修订控制系统包. </P><P>使用这个软件包的好处之一就是可以自动升级ID头标志. 	    <EM>rcs</EM>包中的<BCLASS="COMMAND">co</B>命令可以对特定的保留关键字作参数替换, 	    比如, 可以使用下面这行代码来替换掉脚本中的<CODECLASS="PARAMETER">#$Id$</CODE>, 	      <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;#$Id: hello-world.sh,v 1.1 2004/10/16 02:43:05 bozo Exp $</PRE></FONT></TD></TR></TABLE></P></LI></UL></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="optimizations.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="securityissues.html"ACCESSKEY="N">下一页</A></TD></TR><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top">优化</TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="miscellany.html"ACCESSKEY="U">上一级</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top">安全问题</TD></TR></TABLE></DIV></BODY></HTML>

⌨️ 快捷键说明

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