写脚本时养成结构化和系统方法的习惯.即使你在信封背后随便做一下草稿也是有益的,要养成在写代码前花几分钟来规划和组织你的想法.这儿是一些风格的指南.注意这节文档不是想成为一个官方Shell编程风格.1.非官方的Shell脚本风格注释你的代码.这会使你的代码更容易让别人理解和赏识,同时也便于你维护. 1PASS="$PASS${MATRIX:$(($RANDOM%${#MATRIX})):1}" 2#当你去年写下这句代码时非常的了解它在干什么事,但现在它完全是一个谜. 3#(摘自AntekSawicki的"pw.sh"脚本.) 给脚本和函数加上描述性的头部信息. 1#!/bin/bash 2 3#************************************************# 4# xyz.sh # 5# writtenbyBozoBozeman # 6# July05,2001 # 7# # 8# 清除项目文件. # 9#************************************************# 10 11E_BADDIR=65 #没有那样的目录. 12projectdir=/home/bozo/projects #要清除的目录. 13 14#---------------------------------------------------------# 15#cleanup_pfiles() # 16#删除指定目录里的所有文件. # 17#参数:$target_directory # 18#返回:成功返回0,失败返回$E_BADDIR值. # 19#---------------------------------------------------------# 20cleanup_pfiles() 21{ 22 if[!-d"$1"] #测试目标目录是否存在. 23 then 24 echo"$1isnotadirectory." 25 return$E_BADDIR 26 fi 27 28 rm-f"$1"/* 29 return0 #成功. 30} 31 32cleanup_pfiles$projectdir 33 34exit0 确认#!/bin/bash在脚本的第一行,在任何头部注释行之前.避免使用"魔数," 它是硬编码的字符常量.用有意义的变量名来代替.这使脚本更容易理解并允许在不破坏应用的情况下做改变和更新. 1if[-f/var/log/messages] 2then 3 ... 4fi 5#一年以后,你决定让脚本改为检查/var/log/syslog. 6#那么现在就需要你手动修改脚本里每一处的要改动的代码, 7#希望不要有你疏漏的地方. 8 9#更好的办法是: 10LOGFILE=/var/log/messages #只需要改动一行. 11if[-f"$LOGFILE"] 12then 13 ... 14fi 为变量和函数选择描述性的名字. 1fl=`ls-al$dirname` #含义含糊. 2file_listing=`ls-al$dirname` #更好的名字. 3 4 5MAXVAL=10 #同一个脚本所有程序代码使用脚本常量. 6while["$index"-le"$MAXVAL"] 7... 8 9 10E_NOTFOUND=75 # 把错误代码的代表的变量名大写U, 11 #+并以"E_"开头. 12if[!-e"$filename"] 13then 14 echo"File$filenamenotfound." 15 exit$E_NOTFOUND 16fi 17 18 19MAIL_DIRECTORY=/var/spool/mail/bozo #环境变量名用大写. 20exportMAIL_DIRECTORY 21 22 23GetAnswer() #函数名用适当的大小写混合组成. 24{ 25 prompt=$1 26 echo-n$prompt 27 readanswer 28 return$answer 29} 30 31GetAnswer"Whatisyourfavoritenumber?" 32favorite_number=$? 33echo$favorite_number 34 35 36_uservariable=23 #语法允许,但不推荐. 37#用户定义的变量最好不要用下划线开头. 38#把这个留给系统变量使用更好. 用有含义和系统的方法来使用退出代码(exitcodes). 1E_WRONG_ARGS=65 2... 3... 4exit$E_WRONG_ARGS 最后建议在脚本中使用/usr/include/sysexits.h的退出码,虽然它们主要由C和C++语言编程时使用.使用标准的参数选项.最后建议使用下面一组参数标志. 1-a All:Returnallinformation(includinghiddenfileinfo). 2-b Brief:Shortversion,usuallyforotherscripts. 3-c Copy,concatenate,etc. 4-d Daily:Useinformationfromthewholeday,andnotmerely 5 informationforaspecificinstance/user. 6-e Extended/Elaborate:(oftendoesnotincludehiddenfileinfo). 7-h Help:Verboseusagew/descs,auxinfo,discussion,help. 8 Seealso-V. 9-l Logoutputofscript. 10-m Manual:Launchman-pageforbasecommand. 11-n Numbers:Numericaldataonly. 12-r Recursive:Allfilesinadirectory(and/orallsub-dirs). 13-s Setup&FileMaintenance:Configfilesforthisscript. 14-u Usage:Listofinvocationflagsforthescript. 15-v Verbose:Humanreadableoutput,moreorlessformatted. 16-V Version/License/Copy(right|left)/Contribs(emailtoo). 把复杂的脚本分割成简单一些的模块.用合适的函数来实现各个功能.如果有简单的结构可以使用,不要使用复杂的结构. 1COMMAND 2if[$?-eq0] 3... 4#多余的并且也不直接明了. 5 6ifCOMMAND 7... 8#更简练(或者可能会损失一些可读性).
上一篇:测试和比较: 另一种方法_程序数据_shell
下一篇:shell中的选项_程序数据_shell