怎样写出规范的shell脚本(仅限Scripting with style)

来源:互联网 发布:淘宝c店没有流量咋办 编辑:程序博客网 时间:2024/05/16 14:25


1 概述

1.1 目的

定义Shell脚本命名和编码规范,统一管理Shell脚本,便于自己和别人查看,提高代码书写速度和美观,暂时只对自己进行约束,其它人只供参考。

1.2 概述

本文主要根据Fedora Core 4.0的特点,描述安装脚本、OS初始脚本、补丁制作等方面的代码编写规范,可能大部分还是根据自己的习惯与反复思考后的结果,同样也参考了PHP代码规范等。

1.3 开发工具

shell脚本是个文件,没有开发环境,FC4图形环境下,可用gedit、vi、vim、joe等,推荐使用vim因为这个最通用,他的功能同样是很强大,如果想在图形化下可以用gvim,并将环境设置为sh高亮显示,方法:1)cp /etc/vim/vimrc ~/.vimrc    2) vim ~/.vimrc   去掉”syntax on,并且;Windows下,可用ultraedit。文件保存时,有汉字提示的Shell脚本文件,文件保存时,字符编码必须为GB18030/GBK/GB2132 (UTF-8) 三种格式之一。

2 对象命名规范

2.1 命名约定
1.本文档的命名约定是系统配置文件、脚本文件;

2.文件名、变量名、函数名不超过20个字符;

3.命名只能使用英文字母,数字和下划线,只有一个英文单词时使用全拼,有多个单词时,使用下划线分隔,长度较长时,可以取单词前3~4个字母。

4.文件名全部以小写命名,不能大小写混用(通过U盘交换文件时,大小写可能会丢失,即:大写文件名可能会全部变成小写文件名);

5.避免使用Linux的保留字如true、关键字如PWD等(见附表);

6.从配置文件导出配置时,要注意过滤空行和注释

2.2代码开头约定

1、第一行一般为调用使用的语言

2、下面要有这个程序名,避免更改文件名为无法找到正确的文件

3、版本号

4、更改后的时间

5、作者相关信息

6、该程序的作用,及注意事项

7、版权与是否开放共享GNU说明

8、最后是各版本的更新简要说明
如下面的例子:

#!/bin/bash# -------------------------------------------------------------------------------# Filename:    check_mem.sh# Revision:    1.1# Date:        2009/02/10# Author:      Ajian# Email:       ajian521#gmail.com# Website:     www.ohlinux.com# Description: Plugin to monitor the memory of the system# Notes:       This plugin uses the "" command# -------------------------------------------------------------------------------# Copyright:   2009 (c) Ajian# License:     GPL## This program is free software; you can redistribute it and/or# modify it under the terms of the GNU General Public License# as published by the Free Software Foundation; either version 2# of the License, or (at your option) any later version.## This program is distributed in the hope that it will be useful,# but WITHOUT ANY WARRANTY; without even the implied warranty# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the# GNU General Public License for more details.## you should have received a copy of the GNU General Public License# along with this program (or with Nagios);## Credits go to Ethan Galstad for coding Nagios# If any changes are made to this script, please mail me a copy of the changes# -------------------------------------------------------------------------------#Version 1.0#The first one , can monitor the system memory#Version 1.1#Modify the method of the script ,more fast

2.3 缩进

由于Shell没有很好的编辑环境,所以,建议用四个空格为基数进行缩进,好处在不同的环境下TAB可能代表的空格数不同,造成代码的错乱。用TAB他的优点是速度快方便,可以在编辑的时候也用TAB,但需要转换。

可以在更改编辑器,Windows的就不说了,主要是VIM

:set softtabstop=4

注意不要使用 :set tabstop=4 上面那个是同时把这一个TAB转换为四个空格,而这一条是定义TAB为四个空格,如果到其它编辑器上就会看到默认8个空格的情况,那就会不美观了。

另外将原有的TAB转换为空格,:retab

如果想让刚才的配置永久生效需要改动vim的配置文件 vim ~/.vimrc,更多详细的有用的配置见“VIM配置总结”

2.4 页宽

每行不要超过80字,如果超出,建议用“\”折行,有管道的命令行除外。

2.5 环境变量

变量:全部是大写字母

变量引用:全部以变量名加双引号引用,如”$TERMTYPE”,或“${TERMTYPE}”,如果变量类型是数值型不引用,如:

如果需要从配置文件导出变量,则在变量前加一大写字母,以识别导出变量与自定义环境变量的区别,如:

变量值的引用尽量以$开头,如$(ls inst_*.sh),避免使用`ls inst_*。sh`

循环控制变量可以命名为单个字母, 比如 i、j等。 也可以是更有意义的名称, 比如 UserIndex。

环境变量和全局变量 在脚本开头定义。

函数中使用较多的文件,以环境变量的形式在文件开头定义,仅函数中使用的变量在函数开头定义

2.6 函数

函数以动名词形式存储,且第二个单词首字母要大写,如updateConfig()

每个函数控制在50-100行,超出行数建议分成两个函数

多次反复调用的程序最好分成函数,可以简化程序,使程序条理更清楚

2.7 语句

if 语句

if/then/else 语句中最可能被执行的部分应该放在 then 子句中, 不太可能被执行的部分应该放在 else 子句中。

如果可能, 尽量不要使用一连串的 if 语句, 而应该以 case 语句替代。

不要使 if 语句嵌套超过5层以上, 尽量以更清楚的代码替代。

case 语句

概要

case 语句中的单个子句应该以 case 常数的数字顺序或字母顺序排列。 子句中的执行语句应该尽量保持简单, 一般不要超过4到5行代码。 如果执行语句过于复杂, 应该将它放置在独立的函数中。

case 语句的 *) 子句应该只在正常的默认情况或检测到错误的情况下使用。

格式

case 语句遵循同样的缩进和命名约定。

while 语句

使用 Exit 过程退出 while 循环是不好的; 如果可能, 应该只使用循环条件来结束循环。

while 循环的所有初始化代码应该紧贴在进入 while 循环之前, 不要被其他无关语句分隔开。

循环结束后的处理应该紧跟在循环之后。

for 语句

如果需要执行确定次数的增量循环, 应该用 for 语句替代 while 语句。

2.8 信号捕捉

如果在进行重要配置修改时,应捕捉用户按键,如果用户按下Ctrl+C等重要操作终止程序,则调用回退程序,如:

2.9 关于注释

程序头应加注版本与功能说明的注释。但程序第一行不能汉字。

程序体中应包含必要的注释,注释说明如下:

单行注释,可以放在代码行的尾部或代码行的上部;

多行注释,用于注解复杂的功能说明,可以放在程序体中,也可以放在代码块的开始部分

代码修改时,对修改的内容要加必要版本注释及功能说明。




Area2:一篇比较规范的脚本范例

以下是一个游戏脚本--“挖地雷”。像代码注释段,该有的信息都有,显得非常专业化,再者脚本的内容也看起来很舒服,可以说是化难为易。


  1. #!/bin/bash  
  2. #-------------CopyRight-------------  
  3. #   Name:Mine Sweeping  
  4. #   Version Number:1.00  
  5. #   Type:game  
  6. #   Language:bash shell  
  7. #   Date:2005-10-26  
  8. #   Author:BitBull  
  9. #   Email:BitBull.cn(at)gmail.com  
  10. #------------Environment------------  
  11. #   Terminal: column 80 line 24  
  12. #   Linux 2.6.9 i686  
  13. #   GNU Bash 3.00.15  
  14. #-----------------------------------  
  15.  
  16. #---------------Define--------------  
  17. ECHO="echo -ne" 
  18. ESC="\033[" 
  19.  
  20. OK=0 
  21. FALSE=1 
  22. #--------------Variable--------------  
  23. #ANSI ESC action  
  24. FLASH=5 
  25. REV=7 
  26.  
  27. #color  
  28. NULL=0 
  29. BLACK=30 
  30. RED=31 
  31. GREEN=32 
  32. ORANGE=33 
  33. BLUE=34 
  34. PURPLE=35 
  35. SBLUE=36 
  36. GREY=37 
  37.  
  38. #back color  
  39. BBLACK=40 
  40. BRED=41 
  41. BGREEN=42 
  42. BORANGE=43 
  43. BBLUE=44 
  44. BPURPLE=45 
  45. BSBLUE=46 
  46. BGREY=47 
  47.  
  48. MINE='@' 
  49. FLAG='F' 
  50. NUL=' ' 
  51. SHADOW='X' 
  52.  
  53. X=0 
  54. Y=0 
  55. CurX=1 #cur's X  
  56. CurY=1 #cur's Y  
  57. OCurX=1 #old cur's X  
  58. OCurY=1 #old cur's Y  
  59. MCount=0 #count mine  
  60. FCount=0 #count flag  
  61. SCount=0 #count shadow  
  62. MXYp=0 #MXY Array's ptr  
  63. #---------------Array----------------  
  64.  
  65. #if ${XY[]} == M { mine }  
  66. #if ${XY[]} == F { flag }  
  67. #if ${XY[]} == N { null }  
  68. #if ${XY[]} == S { shadow }  
  69. #if ${XY[]} == [1-8] { tip_num }  
  70. #${XY[]} init in XYInit(i)  
  71.  
  72. MXY[0]=""  
  73.  
  74. #--------------Function--------------  
  75.  
  76. function SttyInit ()  
  77. {  
  78.         stty_save=$(stty -g) #backup stty  
  79.  
  80.         clear  
  81.         trap "GameExit;" 2 15 
  82.         stty -echo  
  83.  
  84.         $ECHO "${ESC}?25l" #hidden cursor  
  85.           
  86.         return $OK  
  87. }  
  88.  
  89. function GameExit ()  
  90. {  
  91.         stty $stty_save  
  92.         stty echo  
  93.         clear  
  94.         trap 2 15 
  95.         $ECHO "${ESC}?25h${ESC}0;0H${ESC}0m" 
  96.  
  97.         exit $OK  
  98. }  
  99.  
  100. #print help  
  101. function Help ()  
  102. {  
  103.         msg="Move:w s a d Dig:j Flag:f NewGame:n Exit:x   --CopyRight-- -2005-10-28 BitBull--" 
  104.         $ECHO "${ESC}${REV};${RED}m${ESC}24;1H${msg}${ESC}${NULL}m" 
  105.  
  106.         return $OK  
  107. }  
  108.  
  109. #print dialog window in screen  
  110. function PMsg ()  
  111. {  
  112.         local title="$1" content="$2" greeting="$3" 
  113.  
  114.         $ECHO "${ESC}${RED}m" 
  115.         $ECHO "${ESC}11;20H ------------------------------------------- " 
  116.         $ECHO "${ESC}12;20H|         ======>$title<======           |" 
  117.         $ECHO "${ESC}13;20H|         $content          |" 
  118.         $ECHO "${ESC}14;20H|         ======>$greeting<======           |" 
  119.         $ECHO "${ESC}15;20H ------------------------------------------- " 
  120.         $ECHO "${ESC}${NULL}m" 
  121.  
  122.         return $OK  
  123. }  
  124.  
  125. #print menu and player choose level,then ${X,Y,MCount,FCount,SCount} init  
  126. function Menu ()  
  127. {  
  128.         local key  
  129.  
  130.         $ECHO "${ESC}6;1H${ESC}${RED}m" 
  131. cat<<MENUEND  
  132.                        +++++++++++++++++++++++++++++  
  133.                        +        (1) Easy           +  
  134.                        +        (2) Normal         +  
  135.                        +        (3) Hardly         +  
  136.                        +        (4) Exit           +  
  137.                        +++++++++++++++++++++++++++++  
  138. MENUEND  
  139.         $ECHO "${ESC}${NULL}m" 
  140.  
  141.         while read -s -n 1 key  
  142.         do  
  143.                 case $key in 
  144.                 1) X=10;Y=10;MCount=10;FCount=10;SCount=100;break 
  145.                 ;;  
  146.                 2) X=20;Y=14;MCount=28;FCount=28;SCount=280;break 
  147.                 ;;  
  148.                 3) X=36;Y=18;MCount=65;FCount=65;SCount=648;break 
  149.                 ;;  
  150.                 4) GameExit  
  151.                 ;;  
  152.                 esac  
  153.         done  
  154.  
  155.         return $OK  
  156. }          
  157.  
  158. #receive CurX CurY,put it into XY[CurX+X*(CurY-1))]  
  159. #if $# == 3;write into XY[]  
  160. #if $# == 2;read from XY[]  
  161. function XYFormat ()  
  162. {  
  163.         local XTmp=$1 YTmp=$2 
  164.  
  165.         if [[ $# -eq 3 ]]  
  166.         then XY[$XTmp+$X*($YTmp-1)]=$3 
  167.         else echo ${XY[$XTmp+$X*($YTmp-1)]}  
  168.         fi          
  169.           
  170.         return $OK  
  171. }  
  172.  
  173. function DrawInit ()  
  174. {  
  175.         local DIline DIline2  
  176.  
  177.         DIline=$( for (( i=1; i<$((X*2)); i++ )) do $ECHO '-';done )  
  178.         DIline2=$( for (( i=0; i<X; i++ )) do $ECHO "|${ESC}${SBLUE}mX${ESC}${NULL}m";done )  
  179.  
  180.         clear  
  181.         Help  
  182.           
  183.         $ECHO "${ESC}1;1H+${DIline}+" 
  184.         for (( i=0; i<Y; i++ ))  
  185.         do  
  186.                 $ECHO "${ESC}$((i+2));1H${DIline2}|" 
  187.         done  
  188.         $ECHO "${ESC}$((Y+2));1H+${DIline}+" 
  189.  
  190.         return $OK  
  191. }  
  192.  
  193. #${XY[*]}=S  
  194. function XYInit ()  
  195. {  
  196.         for (( i=1; i<=$X; i++ ))  
  197.         do  
  198.                 for (( j=1; j<=$Y; j++ ))  
  199.                 do  
  200.                         XYFormat $i $j S  
  201.                 done  
  202.         done  
  203.         return $OK  
  204. }  
  205.  
  206. #check X Y  
  207. function CheckXY ()  
  208. {  
  209.         local XYTmp="$1 $2" 
  210.  
  211.         for(( i=0; i<MXYp; i++ ))  
  212.         do  
  213.                 if [[ "${MXY[i]}" == "$XYTmp" ]]  
  214.                 then return $FALSE  
  215.                 fi  
  216.         done  
  217.  
  218.         return $OK  
  219. }  
  220.  
  221. #RANDOM mine's X Y  
  222. function XYRand ()  
  223. {  
  224.         local XTmp YTmp  
  225.  
  226.         for(( i=0; i<MCount; i++ ))  
  227.         do  
  228.                 while :   
  229.                 do  
  230.                         XTmp=$(( RANDOM % ( X - 1 ) + 1 ))  
  231.                         YTmp=$(( RANDOM % ( Y - 1 ) + 1 ))  
  232.                         CheckXY $XTmp $YTmp  
  233.  
  234.                         if [[ "$?" == "$OK" ]]  
  235.                         then  
  236.                                 XYFormat $XTmp $YTmp M  
  237.                                 MXY[i]="$XTmp $YTmp" 
  238.                                 (( ++MXYp ))  
  239.                                 break 
  240.                         else continue 
  241.                         fi  
  242.                 done  
  243.         done  
  244.           
  245.         return $OK  
  246. }  
  247.  
  248. #DEBUG  
  249. # print ${XY[*]} into ./mine.tmp  
  250. #you can read mine.tmp to know where is mine,xixi~~:)  
  251. #M is mine  
  252. function DEBUGPXY ()  
  253. {  
  254.         rm mine.tmp>/dev/null 2>&1 
  255.         for(( i=1; i<=$Y; i++ ))  
  256.         do  
  257.                 for(( j=1; j<=$X; j++))  
  258.                 do  
  259.                         $ECHO "$(XYFormat $j $i)">>mine.tmp  
  260.                 done  
  261.                 $ECHO "\n">>mine.tmp  
  262.         done  
  263.  
  264.         return $OK  
  265. }  
  266.  
  267. #move cur  
  268. #usage:CurMov [UP|DOWN|LEFT|RIGHT]  
  269. function CurMov ()  
  270. {  
  271.         local direction=$1 Xmin=1 Ymin=1 Xmax=$X Ymax=$Y  
  272.  
  273.         OCurX=$CurX  
  274.         OCurY=$CurY  
  275.  
  276.         case $direction        in 
  277.         "UP")        if [[ $CurY -gt $Ymin ]];then (( CurY-- ));fi  
  278.         ;;  
  279.         "DOWN")        if [[ $CurY -lt $Ymax ]];then (( CurY++ ));fi  
  280.         ;;  
  281.         "LEFT"if [[ $CurX -gt $Xmin ]];then (( CurX-- ));fi  
  282.         ;;  
  283.         "RIGHT")if [[ $CurX -lt $Xmax ]];then (( CurX++ ));fi  
  284.         ;;  
  285.         esac  
  286.  
  287.         if [[ $CurX != $OCurX || $CurY != $OCurY ]]  
  288.         then DrawPoint $CurX $CurY CUR  
  289.         fi  
  290.  
  291.         return $OK  
  292. }  
  293.  
  294. #display point  
  295. #include cur,flag,mine,shadow,nul,tip [1-8]  
  296. function DrawPoint ()  
  297. {  
  298.         local TCurX=$(( $1 * 2 )) TCurY=$(( $2 + 1 )) Type=$3 
  299.         local TOCurX=$(( OCurX * 2 )) TOCurY=$(( OCurY + 1 ))  
  300.         local colr=0 osign=0 sign=0 
  301.           
  302.         case $Type in 
  303.         "CUR")  
  304.                 case $(XYFormat $OCurX $OCurY) in 
  305.                 F)        colr=$PURPLE;osign=$FLAG;;  
  306.                 N)        colr=$NULL;osign=$NUL;;  
  307.                 [1-8])        colr=$ORANGE;osign=$(XYFormat $OCurX $OCurY);;  
  308.                 [SM])        colr=$SBLUE;osign=$SHADOW;;  
  309.                 esac  
  310.  
  311.                 case $(XYFormat $CurX $CurY) in 
  312.                 F)      sign=$FLAG;;  
  313.                 N)      sign=$NUL;;  
  314.                 [1-8])        sign=$(XYFormat $CurX $CurY);;  
  315.                 [SM])     sign=$SHADOW;;  
  316.                 esac  
  317.  
  318.                 $ECHO "${ESC}${colr}m${ESC}${TOCurY};${TOCurX}H${osign}${ESC}${NULL}m" 
  319.                 $ECHO "${ESC}${REV};${FLASH};${ORANGE}m${ESC}${TCurY};${TCurX}H${sign}${ESC}${NULL}m" 
  320.         ;;  
  321.         "SHADOW")  
  322.                 $ECHO "${ESC}${SBLUE}m${ESC}${TCurY};${TCurX}H${SHADOW}${ESC}${NULL}m" 
  323.         ;;  
  324.         "MINE")   
  325.                 $ECHO "${ESC}${REV};${RED}m${ESC}${TCurY};${TCurX}H${MINE}${ESC}${NULL}m" 
  326.         ;;  
  327.         "FLAG")  
  328.                 $ECHO "${ESC}${TCurY};${TCurX}H${ESC}${PURPLE}m${FLAG}${ESC}${NULL}m" 
  329.         ;;  
  330.         [1-8])  
  331.                 $ECHO "${ESC}${TCurY};${TCurX}H${ESC}${ORANGE}m${Type}${ESC}${NULL}m" 
  332.         ;;  
  333.         "NUL")  
  334.                 $ECHO "${ESC}${TCurY};${TCurX}H${NUL}" 
  335.         esac          
  336.  
  337.         return $OK  
  338. }  
  339.  
  340. #check xy  
  341. function Loop ()  
  342. {  
  343.         local XYTmp="$1 $2" 
  344.  
  345.         for (( i=0; i<MXYp; i++ ))  
  346.         do  
  347.                 if [[ "$XYTmp" == "${MXY[i]}" ]]  
  348.                 then $ECHO 1 
  349.                 fi  
  350.         done  
  351.  
  352.         return $OK  
  353. }  
  354.  
  355. #count around mine  
  356. #A B C  
  357. #D X E  
  358. #F G H  
  359. #return mine's number  
  360. function CountM ()  
  361. {  
  362.         local Xmin=1 Ymin=1 Xmax=$X Ymax=$Y minecount=0 n=0 
  363. #A  
  364.         if [[ ( $CurX -gt $Xmin ) && ( $CurY -gt $Ymin ) ]]  
  365.         then  
  366.                 n=$( Loop $((CurX-1)) $((CurY-1)) )  
  367.                 (( minecount += n ))  
  368.                 n=0 
  369.         fi  
  370. #B  
  371.         if [[ $CurY -gt $Ymin ]]  
  372.         then  
  373.                 n=$( Loop $CurX $((CurY-1)) )  
  374.                 (( minecount += n ))  
  375.                 n=0 
  376.         fi  
  377. #C  
  378.         if [[ ( $CurX -lt $Xmax ) && ( $CurY -gt $Ymin ) ]]  
  379.         then  
  380.                 n=$( Loop $((CurX+1)) $((CurY-1)) )  
  381.                 (( minecount += n ))  
  382.                 n=0 
  383.         fi  
  384. #D  
  385.         if [[ $CurX -gt $Xmin ]]  
  386.         then  
  387.                 n=$( Loop $((CurX-1)) $CurY )  
  388.                 (( minecount += n ))  
  389.                 n=0 
  390.         fi  
  391. #E  
  392.         if [[ $CurX -lt $Xmax ]]  
  393.         then  
  394.                 n=$( Loop $((CurX+1)) $CurY )  
  395.                 (( minecount += n ))  
  396.                 n=0 
  397.         fi  
  398. #F  
  399.         if [[ ( $CurX -gt $Xmin ) && ( $CurY -lt $Ymax ) ]]  
  400.         then  
  401.                 n=$( Loop $((CurX-1)) $((CurY+1)) )  
  402.                 (( minecount += n ))  
  403.                 n=0 
  404.         fi  
  405. #G  
  406.         if [[ $CurY -lt $Ymax ]]  
  407.         then   
  408.                 n=$( Loop $CurX $((CurY+1)) )  
  409.                 (( minecount += n ))  
  410.                 n=0 
  411.         fi  
  412. #H  
  413.         if [[ ( $CurX -lt $Xmax ) && ( $CurY -lt $Ymax ) ]]  
  414.         then  
  415.                 n=$( Loop $((CurX+1)) $((CurY+1)) )  
  416.                 (( minecount += n ))  
  417.                 n=0 
  418.         fi  
  419.  
  420.         return $minecount  
  421. }  
  422.  
  423. #dig  
  424. #if mine ,gameover  
  425. #else tip around mine's number  
  426. function Dig ()  
  427. {  
  428.         local key minenum=0 
  429.  
  430.         case $(XYFormat $CurX $CurY) in 
  431.         M)  
  432.                 DrawPoint $CurX $CurY MINE  
  433.                 read -s -n 1 key  
  434.                 GameOver "Game Over" 
  435.         ;;  
  436.         S)  
  437.                 CountM  
  438.                 minenum=$?  
  439.                 if [[ $minenum -eq $NULL ]]  
  440.                 then  
  441.                         XYFormat $CurX $CurY N  
  442.                         DrawPoint $CurX $CurY NUL  
  443.                 else 
  444.                         XYFormat $CurX $CurY $minenum  
  445.                         DrawPoint $CurX $CurY $minenum  
  446.                 fi  
  447.           
  448.                 (( SCount-- ))  
  449.                 if [[ $SCount -eq $MCount ]]  
  450.                 then GameOver "Well Done" 
  451.                 fi          
  452.         ;;  
  453.         esac  
  454.         DrawPoint $CurX $CurY CUR  
  455.  
  456.         return $OK  
  457. }  
  458.  
  459. #draw flag's number  
  460. function DrawFCount ()  
  461. {  
  462.         $ECHO "${ESC}22;34H${ESC};${PURPLE}mFLAG=${FCount}  ${ESC}${NULL}m" 
  463. }  
  464.  
  465. #sign mine  
  466. function Flag ()  
  467. {  
  468.         local XYTmp="$CurX $CurY";stat=$FALSE  
  469.  
  470.         case $(XYFormat $CurX $CurY) in 
  471.         F)  
  472.                 for (( i=1; i<MXYp; i++ ))  
  473.                 do  
  474.                         if [[ "${MXY[i]}" == "$XYTmp" ]]  
  475.                         then XYFormat $CurX $CurY M;stat=$OK;break 
  476.                         fi  
  477.                 done  
  478.                 if [[ $stat == $FALSE ]]  
  479.                 then XYFormat $CurX $CurY S  
  480.                 fi  
  481.  
  482.                 DrawPoint $CurX $CurY SHADOW  
  483.                 (( FCount++ ))  
  484.                 DrawFCount  
  485.         ;;  
  486.         [SM])          
  487.                 if [[ $FCount -eq $NULL ]]  
  488.                 then return $FALSE  
  489.                 fi  
  490.  
  491.                 DrawPoint $CurX $CurY FLAG  
  492.                 XYFormat $CurX $CurY F  
  493.                 (( FCount-- ))  
  494.                 DrawFCount  
  495.         ;;  
  496.         esac  
  497.         DrawPoint $CurX $CurY CUR  
  498.  
  499.         return $OK  
  500. }  
  501.  
  502. function GameOver ()  
  503. {  
  504.         local key msgtitle=$1 
  505.  
  506.         PMsg "$msgtitle" "Do you want replay?<y/n>" "Thank You" 
  507.         while read -s -n 1 key  
  508.         do  
  509.                 case $key in 
  510.                 [yY])        exec $(dirname $0)/$(basename $0);;  
  511.                 [nN])        GameExit;;  
  512.                 *)        continue;;  
  513.                 esac  
  514.         done  
  515.  
  516.         return $OK          
  517. }  
  518.           
  519. #main  
  520. #drawscreen and control  
  521. function Main ()  
  522. {  
  523.         local key  
  524.  
  525.         XYInit  
  526.         XYRand  
  527. ############################  
  528. # if you enable DEBUGPXY,  
  529. #you can know where is mine  
  530. #        DEBUGPXY  #delete this line's #  
  531. #then cat ./mine.tmp  
  532. ############################          
  533.  
  534.         DrawPoint $CurX $CurY CUR  
  535.         DrawFCount          
  536.  
  537.         while read -s -n 1 key  
  538.         do  
  539.                 case $key in 
  540.                 [wW])        CurMov UP;;  
  541.                 [sS])        CurMov DOWN;;  
  542.                 [aA])        CurMov LEFT;;  
  543.                 [dD])        CurMov RIGHT;;  
  544.                 [jJ])        Dig;;  
  545.                 [fF])        Flag;;  
  546.                 [nN])        exec $(dirname $0)/$(basename $0);;  
  547.                 [xX])        GameExit;;  
  548.                 esac  
  549.         done  
  550.  
  551.         return $OK  
  552. }  
  553. #---------------Main-----------------  
  554.  
  555. SttyInit  
  556. Menu #X Y MCount FCount SCount OK!  
  557. DrawInit  
  558. Main  


Area3:书籍中提及的Scripting with style

http://tldp.org/LDP/abs/html/scrstyle.html这是链接地址





Area4:shell脚本学习好书推荐
ABS,高级Bash脚本编程指南,http://www.tsnc.edu.cn/default/tsnc_wgrj/doc/abs-3.9.1_cn/html/


推荐看这本:《Learning the bash shell》(http://book.douban.com/subject/3296982/)


内容清晰,提纲挈领
书不是很厚,可以很快看完,然后投入实践




1. < < Advanced Bash-Scripting Guide > > ,即ABS,http://tldp.org/LDP/abs/html/。
经典的Online教程,内容全面,对每一个知识点都有相当多的实例,适合系统的学习。之前有翻译的版本出到过3.9.1。


2. < < UNIX Shells by Example Fourth Edition > > ,网上有chm下载。
这本书适合用的时候查询,结构很清晰,以语法为主。它的亮点在于将几种常用的不同种类的Shell分开来描述。


3. < < Linux Command Line and Shell Scripting Bible > > ,网上有pdf下载。
这本书也很全面。适合那些喜欢一章一章看书的人去学,印刷质量相当的好。


4. < < LINUX与UNIX Shell编程指南 > > ,网上有pdf下载。
中文。中文。中文。


< < UNIX Shells by Example Fourth Edition > > 推荐这本,网上有中文版pdf。内容丰富,讲解也不错。每个例子都是c shell ,ksh,bash三种都有,最好着重学习一个,个人喜欢bash,简练且紧凑。c shell的交互功能做的倒是不错,不过要是用它写脚本你会想去撞墙。
其实学什么教材倒是其次,坚持只用linux做桌面环境才是关键,同时拔掉你的鼠标。




原创粉丝点击