shell编程规范

1 脚本名以.sh结尾,名称尽可能见名之意,好比ClearLog.sh Clear_Log.sh clearlog.sh SerRestart.sh Ser_Restart.sh;
2 尽可能使用UTF-8编码,注释及输出尽可能使用英文;
3 通常给到执行权限,但一些关于变量的配置文件不用加执行权限;
4 执行的时候可使用bash 执行,或者使用bash -x执行,能够直观的显示具体的执行过程;
5 脚本首行使用/bin/bash,没有空格,不带任何选项;
6 第二行为空格,或者是添加一行空注释
7 接着开始注释内容:文件名、功能描述、做者、最后修改日期、版本号以及一些说明,还加上邮箱/手机号作为联系,若是能够,须要加上版权声明; 
8 注释内容以后空一行开始定义shell脚本中的变量;
9 脚本内的变量定义,尽可能使用大写,或者大小写驼峰写法,或者使用下划线链接的方式。变量名要见名之意,避免a,b,c相似的定义,变量的定义先后不要用空格。
          若是是整形,须要使用declare -i来声明。
          若是是数组,则须要使用declare -a来声明。
          若是是只读变量,则须要使用declare -r来声明。
          变量值尽可能使用双引号引发来,若是要使用强引用,如变量值中包含$符号,则使用”单引号引发来。
          若是要将命令的执行结果赋值给变量,则使用反引号,或者使用$().
10 变量的引用使用如下方式:
         ${GameZone}
         $GameZone
         推荐使用第一种,如:tar zcf ${GameZone}.tar.gz /apps/data/
11 单引号和双引号混合使用的场景:
         echo ‘Welcome to “my school”‘
12 在某些特殊的环境下,shell脚本里引用的命令,有多是本身定义的bin路径,在执行的时候会报出command not found,html

        解决的方式是在执行的时候命令跟全路径,或者在脚本的开始,显式的设置一下PATH 变量,nginx

        如: export PATH=”/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/apps/bin/”shell

13 建议在脚本执行的开始重读下/etc/profile 或者是本身定义的关于环境变量的配置文件,推荐使用source,数据库

        如: source /etc/profile
               source /opt/sh/appenv.sh
14 使用here document;
        若是脚本在执行的时候须要大段输出提示信息,但是使用如下方式:
        cat << EOF
       This scripts used for XXX
       Usage:$0 [option]
       Pls be careful.
       Enjoy Yourself.
       EOF
       若是只是单行提示信息,但是使用echo的方式,能够添加颜色:
       echo “Welcome to use my script”
15 若是须要在脚本里生成配置文件的模板,也可使用here document的方式,示例以下:
       cat>>/etc/rsyncd.conf<<EOF
       log file = /usr/local/logs/rsyncd.log
       transfer logging = yes
       log format = %t %a %m %f %b
       syslog facility = local3
       timeout = 300
       [data1]
       path=/home/username
       list=yes
       ignore errors
       auth users = data1user
       secrets file=/etc/rsyncd/rsyncd.secrets
       comment = some description about this moudle
       exclude = test1/ test2/
       EOF
16 若是须要建立临时文件,可使用以下方式:
       mktemp -d /tmp/file$$
17 条件测试的时候,尽可能使用[[]],而不用[]或者test,由于[[]]功能会更强大                                              
       [[ -d /tmp/logs ]]
      不在使用[ “x$NAME” == “x” ]这种方式;
18 算数运算使用(())或者是中括号,可是记得括号里面的变量不要再加$
       ((12+i))
       而非((12+$i))
19 使用高级变量的用法,好比使用
       ${GameZone:?”Error Message”}确保关键变量已经定义
       ${GameZone:=”S1″} 或者设置默认值
       不然:
       rm -rf ${GameZone}/* 后果不堪设想
20 可使用&& ||来替代简单的if-then-else-fi语句。
21 尽可能给每条语句或者代码段的执行给一个执行结果状态,若是某条命令执行失败,则exit N.
       尽量使用$?来检查前面一条命令的执行状态。
22 流程控制语句尽可能使用一下方式:
       for I in {1..10};do
        ..。
       done
       while true;do
        …
       done
       if [];then
        …
       fi
23 若是命令过长,能够分红多行来写,好比:
       ./configure \
       –prefix=/usr \
       –sbin-path=/usr/sbin/nginx \
       –conf-path=/etc/nginx/nginx.conf \
       –error-log-path=/var/log/nginx/error.log \
       –http-log-path=/var/log/nginx/access.log \
       –pid-path=/var/run/nginx/nginx.pid  \
       –lock-path=/var/lock/nginx.lock \
24 shell脚本并不要求强制缩进,可是要养成缩进的好习惯,可使用两个空格,建议使用tab键。如:
       if [];then
         …
       fi
25 尽量多的注释信息。
26 想要获取当前脚本所在目录,可使用
      ScriptDir=$(cd $(dirname $0) && pwd)
27 尽量的使用函数的功能,将不一样的功能定义为函数,直接引用函数;
28 若是自定义环境变量,能够专门写到一个文件中,避免在/etc/profile中添加;
29 禁止使用SUID和SGID以及ACL用户访问控制列表的功能,若是须要较高权限,可使用sudo;
30 关键的操做须有日志输出,专门记录操做的成功或者失败以及执行的时间点。
31 脚本内可能包含敏感信息,如服务器密码或者是数据库密码,若是公开以前先确认敏感信息是否已经删除。数组