两个很详细的shell 实例 一般编程步骤 现在我们来讨论编写一个脚本的一般步骤任何优秀的脚本都应该具有帮助和输入参数并且写一个伪脚本(frameworksh)该脚本包含了大多数脚本都需要的框架结构是一个非常不错的主意这时候在写一个新的脚本时我们只需要执行一下copy命令 cp frameworksh myscript 然后再插入自己的函数 让我们再看两个例子 二进制到十进制的转换 脚本 bd 将二进制数 (比如 ) 转换为相应的十进制数这也是一个用expr命令进行数学运算的例子 复制代码 代码如下: #!/bin/sh # vim: set sw= ts= et: help() { cat < bh convert binary to decimal USAGE: bh [h] binarynum OPTIONS: h help text EXAMPLE: bh will return HELP exit } error() { # print an error and exit echo $ exit } lastchar() { # return the last character of a string in $rval if [ z $ ]; then # empty string rval= return fi # wc puts some space behind the output this is why we need sed: numofchar=`echo n $ | wc c | sed s/ //g ` # now cut out the last char rval=`echo n $ | cut b $numofchar` } chop() { # remove the last character in string and return it in $rval if [ z $ ]; then # empty string rval= return fi # wc puts some space behind the output this is why we need sed: numofchar=`echo n $ | wc c | sed s/ //g ` if [ $numofchar = ]; then # only one char in string rval= return fi numofcharminus=`expr $numofchar ` # now cut all but the last char: rval=`echo n $ | cut b ${numofcharminus}` } while [ n $ ]; do case $ in h) help;shift ;; # function help is called ) shift;break;; # end of options *) error error: no such option $ h for help;; *) break;; esac done # The main program sum= weight= # one arg must be given: [ z $ ] && help binnum=$ binnumorig=$ while [ n $binnum ]; do lastchar $binnum if [ $rval = ]; then sum=`expr $weight + $sum` fi # remove the last position in $binnum chop $binnum binnum=$rval weight=`expr $weight * ` done echo binary $binnumorig is decimal $sum # 该脚本使用的算法是利用十进制和二进制数权值 ()比如二进制可以这样转换成十进制 * + * = 为了得到单个的二进制数我们是用了lastchar 函数该函数使用wc ?c计算字符个数然后使用cut命令取出末尾一个字符Chop函数的功能则是移除最后一个字符 文件循环程序 或许您是想将所有发出的邮件保存到一个文件中的人们中的一员但是在过了几个月以后这个文件可能会变得很大以至于使对该文件的访问速度变慢下面的脚本rotatefile 可以解决这个问题这个脚本可以重命名邮件保存文件(假设为outmail)为outmail而对于outmail就变成了outmail 等等等等 复制代码 代码如下: #!/bin/sh # vim: set sw= ts= et: ver= help() { cat < rotatefile rotate the file name USAGE: rotatefile [h] filename OPTIONS: h help text EXAMPLE: rotatefile out This will eg rename out to out out to out out to out and create an empty outfile The max number is version $ver HELP exit } error() { echo $ exit } while [ n $ ]; do case $ in h) help;shift ;; ) break;; *) echo error: no such option $ h for help;exit ;; *) break;; esac done # input check: if [ z $ ] ; then error ERROR: you must specify a file use h for help fi filen=$ # rename any etc file: for n in Array ; do if [ f $filen$n ]; then p=`expr $n + ` echo mv $filen$n $filen$p mv $filen$n $filen$p fi done # rename the original file: if [ f $filen ]; then echo mv $filen $filen mv $filen $filen fi echo touch $filen touch $filen 这个脚本是如何工作的呢?在检测用户提供了一个文件名以后我们进行一个Array到的循环文件Array被命名为文件重命名为Array等等循环完成之后我们将原始文件命名为文件同时建立一个与原始文件同名的空文件 调试 最简单的调试命令当然是使用echo命令您可以使用echo在任何怀疑出错的地方打印任何变量值这也是绝大多数的shell程序员要花费%的时间来调试程序的原因Shell程序的好处在于不需要重新编译插入一个echo命令也不需要多少时间 shell也有一个真实的调试模式如果在脚本strangescript 中有错误您可以这样来进行调试 sh x strangescript 这将执行该脚本并显示所有变量的值 shell还有一个不需要执行脚本只是检查语法的模式可以这样使用 sh n your_script 这将返回所有语法错误 我们希望您现在可以开始写您自己的shell脚本希望您玩得开心 |