📄 unofficialst.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><HTML><HEAD><TITLE>非官方的Shell脚本编写风格</TITLE><METANAME="GENERATOR"CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINKREL="HOME"TITLE="高级Bash脚本编程指南"HREF="index.html"><LINKREL="UP"TITLE="脚本编程风格"HREF="scrstyle.html"><LINKREL="PREVIOUS"TITLE="脚本编程风格"HREF="scrstyle.html"><LINKREL="NEXT"TITLE="杂项"HREF="miscellany.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="scrstyle.html"ACCESSKEY="P">前一页</A></TD><TDWIDTH="80%"ALIGN="center"VALIGN="bottom">32. 脚本编程风格</TD><TDWIDTH="10%"ALIGN="right"VALIGN="bottom"><AHREF="miscellany.html"ACCESSKEY="N">下一页</A></TD></TR></TABLE><HRALIGN="LEFT"WIDTH="100%"></DIV><DIVCLASS="SECT1"><H1CLASS="SECT1"><ANAME="UNOFFICIALST">32.1. 非官方的Shell脚本编写风格</A></H1><P></P><UL><LI><P>习惯性的注释你的代码. 这可以让别人更容易看懂(或者感激)你的代码(译者注: 犯错时, 别人也会靠注释找到你), 而且也更便于维护. <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 PASS="$PASS${MATRIX:$(($RANDOM%${#MATRIX})):1}" 2 # 去年你写下这段代码的时候, 你非常了解这段代码的含义, 但现在它对你来说完全是个谜. 3 # (摘自Antek Sawicki的"pw.sh"脚本.)</PRE></FONT></TD></TR></TABLE> </P><P>给脚本和函数加上描述性的头信息. <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 #!/bin/bash 2 3 #************************************************# 4 # xyz.sh # 5 # written by Bozo Bozeman # 6 # July 05, 2001 # 7 # # 8 # Clean up project files. # 9 #************************************************# 10 11 E_BADDIR=65 # 没有这个目录. 12 projectdir=/home/bozo/projects # 想要清除的目录. 13 14 # --------------------------------------------------------- # 15 # cleanup_pfiles () # 16 # 删除指定目录中的所有文件. # 17 # Parameter: $target_directory # 18 # 返回值: 0表示成功, 失败返回$E_BADDIR. # 19 # --------------------------------------------------------- # 20 cleanup_pfiles () 21 { 22 if [ ! -d "$1" ] # Test if target directory exists. 23 then 24 echo "$1 is not a directory." 25 return $E_BADDIR 26 fi 27 28 rm -f "$1"/* 29 return 0 # Success. 30 } 31 32 cleanup_pfiles $projectdir 33 34 exit 0</PRE></FONT></TD></TR></TABLE> 在脚本开头添加任何注释之前, 一定要确保<EM>#!/bin/bash</EM>放在脚本第一行的开头. </P></LI><LI><P>避免使用<SPANCLASS="QUOTE">"魔法数字"</SPAN>, <ANAME="AEN15556"HREF="#FTN.AEN15556"><SPANCLASS="footnote">[1]</SPAN></A> 也就是, 避免<SPANCLASS="QUOTE">"写死的"</SPAN>字符常量. 可以使用有意义的变量名来代替. 这使得脚本更易于理解, 并且允许在不破坏应用的情况下进行修改和更新. <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 if [ -f /var/log/messages ] 2 then 3 ... 4 fi 5 # 一年以后, 你决定修改这个脚本, 让它来检查/var/log/syslog. 6 # 到时候你就必须一行一行的手动修改这个脚本, 7 # 并且寄希望于没有遗漏的地方. 8 9 # 更好的办法是: 10 LOGFILE=/var/log/messages # 只需要改动一行就行了. 11 if [ -f "$LOGFILE" ] 12 then 13 ... 14 fi</PRE></FONT></TD></TR></TABLE> </P></LI><LI><P>给变量和函数起一些有意义的名字. <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 fl=`ls -al $dirname` # 含义模糊. 2 file_listing=`ls -al $dirname` # 更好的名字. 3 4 5 MAXVAL=10 # 使用变量来代替脚本常量, 并且在脚本中都是用这个变量. 6 while [ "$index" -le "$MAXVAL" ] 7 ... 8 9 10 E_NOTFOUND=75 # 错误码使用大写, 11 #+ 并且命名的时候用"E_"作为前缀. 12 if [ ! -e "$filename" ] 13 then 14 echo "File $filename not found." 15 exit $E_NOTFOUND 16 fi 17 18 19 MAIL_DIRECTORY=/var/spool/mail/bozo # 环境变量名使用大写. 20 export MAIL_DIRECTORY 21 22 23 GetAnswer () # 函数名采用大小写混合的方式. 24 { 25 prompt=$1 26 echo -n $prompt 27 read answer 28 return $answer 29 } 30 31 GetAnswer "What is your favorite number? " 32 favorite_number=$? 33 echo $favorite_number 34 35 36 _uservariable=23 # 语法上可以这么起名, 但是不推荐. 37 # 用户定义的变量名最好不要以下划线开头. 38 # 因为以下划线开头的变量, 一般都保留, 作为系统变量. </PRE></FONT></TD></TR></TABLE> </P></LI><LI><P><AHREF="exit-status.html#EXITCOMMANDREF">退出码</A>最好也采用具有系统性的或有意义的命名方式. <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 E_WRONG_ARGS=65 2 ... 3 ... 4 exit $E_WRONG_ARGS</PRE></FONT></TD></TR></TABLE> 也请参考<AHREF="exitcodes.html">Appendix D</A>. </P><P><EM>最后</EM>, 我们建议采用<TTCLASS="FILENAME">/usr/include/sysexits.h</TT>中的定义作为退出码, 虽然这些定义主要用于C/C++编程语言. </P></LI><LI><P>在脚本调用中使用标准化的参数标志. <EM>最后</EM>, 我们建议使用下面的参数集. </P><P> <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 -a 全部: 返回全部信息(包括隐藏的文件信息). 2 -b 摘要: 缩减版本, 通常用于其它版本. 通常用于其它脚本. 3 -c 拷贝, 连接, 等等. 4 -d 日常的: 使用全天的信息, 5 而不仅仅是特定用户或特定实例的信息. 6 -e 扩展/详细描述: (通常不包括隐藏文件信息). 7 -h 帮助: 详细的使用方法, 附加信息, 讨论, 帮助. 8 也请参考-V. 9 -l 打印出脚本的输出记录. 10 -m 手册: 显示基本命令的man页. 11 -n 数字: 仅使用数字数据. 12 -r 递归: 这个目录中所有的文件(也包含所有子目录). 13 -s 安装&文件维护: 这个脚本的配置文件. 14 -u 用法: 列出脚本的调用方法. 15 -v 详细信息: 只读输出, 或多或少的会做一些格式化. 16 -V 版本/许可/版权Copy(right|left)/捐助(邮件列表). </PRE></FONT></TD></TR></TABLE> </P><P>也请参考<AHREF="standard-options.html">Section F.1</A>. </P></LI><LI><P>将一个复杂脚本分割成一些简单的模块. 使用合适的函数来实现模块的功能. 请参考<AHREF="bashver2.html#EX79">例子 34-4</A>. </P></LI><LI><P>如果有更简单的结构可以使用的话, 就不要使用复杂的结构. <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 COMMAND 2 if [ $? -eq 0 ] 3 ... 4 # 多余, 而且不好理解. 5 6 if COMMAND 7 ... 8 # 更简练(可能会损失一些可读性). </PRE></FONT></TD></TR></TABLE> </P></LI></UL><TABLEBORDER="0"WIDTH="100%"CELLSPACING="0"CELLPADDING="0"CLASS="EPIGRAPH"><TR><TDWIDTH="45%"> </TD><TDWIDTH="45%"ALIGN="LEFT"VALIGN="TOP"><I><P><I>... 当我阅读UNIX中Bourne shell (/bin/sh)部分的源代码时. 我被震惊了, 有多少简单的算法被恶心的编码风格弄得令人看不懂, 并且因此变得没用. 我问我自己, <SPANCLASS="QUOTE">"有人会对这种代码感到骄傲和自豪么?"</SPAN></I></P></I></TD></TR><TR><TDWIDTH="45%"> </TD><TDWIDTH="45%"ALIGN="RIGHT"VALIGN="TOP"><I><SPANCLASS="ATTRIBUTION">Landon Noll</SPAN></I></TD></TR></TABLE></DIV><H3CLASS="FOOTNOTES">注意事项</H3><TABLEBORDER="0"CLASS="FOOTNOTES"WIDTH="100%"><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="5%"><ANAME="FTN.AEN15556"HREF="unofficialst.html#AEN15556"><SPANCLASS="footnote">[1]</SPAN></A></TD><TDALIGN="LEFT"VALIGN="TOP"WIDTH="95%"><P>在这种上下文中所说的<SPANCLASS="QUOTE">"魔法数字"</SPAN>与用来指明文件类型的<AHREF="sha-bang.html#MAGNUMREF">魔法数字</A>, 在含义上完全不同. </P></TD></TR></TABLE><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="scrstyle.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="miscellany.html"ACCESSKEY="N">下一页</A></TD></TR><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top">脚本编程风格</TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="scrstyle.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 + -