📄 assortedtips.html
字号:
33 # ----- 34 # 修改这个脚本, 使其能够让LETTERSET作为命令行参数. 35 # 将第11 - 13行的过滤器参数化(比如, 可以使用变量$FILTER), 36 #+ 这样我们就可以根据传递的参数来指定功能. 37 38 # 可以参考脚本agram2.sh, 39 #+ 与这个例子稍微有些不同. </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 CMD=command1 # 第一选择. 2 PlanB=command2 # 如果第一选择不存在就选用这个. 3 4 command_test=$(whatis "$CMD" | grep 'nothing appropriate') 5 # 如果在系统中没找到'command1', 6 #+ 那么'whatis'将返回"command1: nothing appropriate." 7 # 8 # 另一种更安全的做法是: 9 # command_test=$(whereis "$CMD" | grep \/) 10 # 但是下面的测试条件应该反过来, 11 #+ 因为变量$command_test只有在$CMD存在于系统上的时候, 12 #+ 才会有内容. 13 # (感谢, bojster.) 14 15 16 if [[ -z "$command_test" ]] # 检查命令是否存在. 17 then 18 $CMD option1 option2 # 使用选项来调用command1. 19 else # 否则, 20 $PlanB #+ 运行command2. 21 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 if ls -l nonexistent_filename | grep -q 'No such file or directory' 2 then echo "File \"nonexistent_filename\" does not exist." 3 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 if ls -l nonexistent_filename 2>&1 | grep -q 'No such file or directory' 2 # ^^^^ 3 then echo "File \"nonexistent_filename\" does not exist." 4 fi 5 6 # 感谢, 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 #!/bin/bash 2 # dialog.sh: 使用'gdialog'窗口部件. 3 # 必须在你的系统上安装'gdialog'才能运行这个脚本. 4 # 版本1.1 (04/05/05最后修正) 5 6 # 这个脚本的灵感来源于下面的文章. 7 # "Scripting for X Productivity," by Marco Fioretti, 8 # LINUX JOURNAL, Issue 113, September 2003, pp. 86-9. 9 # 感谢你们, 所有的LINUX JOURNAL好人. 10 11 12 # 在对话框窗口中的输入错误. 13 E_INPUT=65 14 # 输入窗口的显示尺寸. 15 HEIGHT=50 16 WIDTH=60 17 18 # 输出文件名(由脚本名构造). 19 OUTFILE=$0.output 20 21 # 将脚本的内容显示到文本窗口中. 22 gdialog --title "Displaying: $0" --textbox $0 $HEIGHT $WIDTH 23 24 25 26 # 现在, 我们将输入保存到文件中. 27 echo -n "VARIABLE=" > $OUTFILE 28 gdialog --title "User Input" --inputbox "Enter variable, please:" \ 29 $HEIGHT $WIDTH 2>> $OUTFILE 30 31 32 if [ "$?" -eq 0 ] 33 # 检查退出状态码, 是一个好习惯. 34 then 35 echo "Executed \"dialog box\" without errors." 36 else 37 echo "Error(s) in \"dialog box\" execution." 38 # 或者, 点"Cancel"按钮, 而不是"OK". 39 rm $OUTFILE 40 exit $E_INPUT 41 fi 42 43 44 45 # 现在, 我们将重新获得并显示保存的变量. 46 . $OUTFILE # 'Source'(执行)保存的文件. 47 echo "The variable input in the \"input box\" was: "$VARIABLE"" 48 49 50 rm $OUTFILE # 清除临时文件. 51 # 某些应用可能需要保留这个文件. 52 53 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 #$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 + -