目录

前言:

一、命名规范

1.1脚本命名

1.2变量命名

1.3参数命名

1.4函数命名规范

二、编写规范

2.1.基本信息

2.2代码注释规范

2.3空行

2.4缩进

2.5续行

2.6输出

2.7 调用系统变量

2.8 脚本中使用命令

2.9 输入与退出

三、调试

3.1 错误退出

3.2脚本语法检查

3.3调试










前言:

本规范目的是保证运维成员编码的统一。

本规范的核心规则就是脚本的命名规则。

此规范必要是可以打破。




一、命名规范


  1.1脚本命名

      脚本的名字需与其功能保持一致,让人一看名字就大概知道是干什么用。

  

  1.2变量命名

      变量的命名应遵循某种规范,使用"_"作为单词间的分隔符,单词尽量使用全名                  

 如:

1



2



3

MYSQL_SOCK_KEY=0 



Mysql_Tmp= /opt/tmp



MysqlTmp= /opt/tmp

   1.3参数命名

    参数命名原则全用小写

    如:

1

mysql_socket


   1.4函数命名规范

    函数表示的是一个动作,所以它的结构应该是动词+名词,动词必须小写,后面的名称首字母大写,如getMaterialCode。函数命名尽量不要使用缩 写,而且它的名称应该使人一目了然,能够从名称就知道这个函数的功能。当函数名称不足以表达其功能时,应使用在函数头部加上让调用者足够明白的注释。

如下面例子:

1



2



3

getHostName(){



cat  /etc/sysconfig/network | awk  -F "="  "/HOSTNAME/" '{print$2}'



}



二、编写规范

  2.1.基本信息

    (1)在每个脚本模块的最上面,勿忘记添加开头#!/bin/bash

    (2)脚本编写人(使用英文名或中文拼音缩写)

    (3)脚本创建时间、

    (4)脚本修改时间、修改说明、输入参数、输出参数、

    (5)脚本描述等。

    如下面例子:

1



2



3



4



5



6



7



8



9



10



11



12



13



14



15



16



17



18



19



20

#!/bin/bash



# -------------------------------------------------------------------------------



# Filename:    check_mem.sh



# Revision:    1.1



# Date:        2015/02/10



# Author:      Gong



# Email:       Gong@



# Description: Plugin to monitor the memory of the system



# -------------------------------------------------------------------------------



# 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



-------------------------------------------------------------------------------



#Version 1.0



#The first one , can monitor the system memory



#Version 1.1



#Modify the method of the script ,more fast


可通过.vimrc文件编辑脚本时,自动在文件头加信息

1



2



3



4



5



6



7



8



9



10



11



12



13



14



15



16



17



18



19



20



21



22



23



24



25



26



27



28



29



30



31



32



33



34



35

autocmd BufNewFile *.cpp,*.[ch],*.sh,*.java  exec  ":call SetTitle()" 



func SetTitle()



if  &filetype ==  'sh'



call setline(1,  "\#!/bin/bash"



call append(line( "." ), "\#########################################################################"



call append(line( "." )+1,  "\# File Name: " . expand ( "%" )) 



call append(line( "." )+2,  "\# Author: gongy"



call append(line( "." )+3,  "\# Mail:" 



call append(line( "." )+4,  "\# Created time: " .strftime( "%Y-%m-%d %H:%M:%S" )) 



call append(line( "." )+5,  "\# Last modified: " .strftime( "%Y-%m-%d %H:%M:%S" ))



call append(line( "." )+6,  "\# Description: "



call append(line( "." )+7,  "\#########################################################################"



call append(line( "." )+8,  ""



else



call setline(1,  "/*************************************************************************"



call append(line( "." ),   "  * File Name: " . expand ( "%" )) 



call append(line( "." )+1,  "  * Description: "



call append(line( "." )+2,  "  * Author: chu"



call append(line( "." )+3,  "  * Mail: "



call append(line( "." )+4,  "  * Created time: " .strftime( "%Y-%m-%d %H:%M:%S" )) 



call append(line( "." )+5,  "  * Last modified: " .strftime( "%Y-%m-%d %H:%M:%S" )) 



call append(line( "." )+6,  " ************************************************************************/"



call append(line( "." )+7,  "" )



endif



autocmd BufNewFile * normal G



endfunc



autocmd BufWritePre,BufWritePre,FileWritePre  *.sh    ks|call LastModified()|'s  



func LastModified()



if  line( "$" ) > 20



let  l = 20



else 



let  l = line( "$" )



endif



exe  "1,"  . l .  "g/Last modified: /s/Last modified: .*/Last modified:" .strftime( "%Y-%m-%d %H:%M:%S" )



endfunc



2.2代码注释规范

    注释务必做到准确简洁,能够充分表达代码实现的功能。

例如:

1



2



3



4

#get system name.



getHostName(){



cat  /etc/sysconfig/network | awk  -F "="  "/HOSTNAME/" '{print$2}'



}


2.3空行

    空行是区分代码块与块的间隔,在函数之间必须加上空行;而在函数内部,变量声明块和实现块(实现块指除变量声明外的其他代码)要使用空行来间隔,实现块的内部,通过空行来标识一个功能段。



2.4缩进

    必须严格执行缩进,变量声明块不缩进,实现块必须保证全部缩进(不可能有实现块是行首对齐的);对于基本的控制结构来说,必须要有缩进,如IF、DO、WITH、FOR、WHILE块。


2.5续行

    对于过长的语句来说,必须使用续行,续行位置要有明显意义,例如,sql ="SELECT [code],[name] FROM [Person]"_&"WHERE [code] LIKE'001%'"。

对于使用比较频繁的代码块来说,最好将其写成函数,并尽量将功能复杂的大函数拆分成小函数。


2.6输出

    非交互式脚本,后台运行的脚本,脚本不允许输出内容到屏幕上,一律定向到/dev/null

    例如:

1



2

SEND_MSG=curl  "http://&xxxxx"



$SEND_MSG  &>  /dev/null


2.7 调用系统变量

    脚本中需要调用系统变量时,需要在脚本中重新定义该变量

例如:

1



2



3

PATH= /usr/local/sbin : /usr/local/bin : /sbin : /bin : /usr/sbin : /usr/bin : /root/bin



JAVA_HOME= /usr/local/JAVA/



export  PATH=$JAVA_HOME:$PATH

  

2.8 脚本中使用命令

   脚本中使用系统命令时,需在命令行正确执行,测试得出正确结果,再将命令行中执行正确的命令粘贴至脚本中

  

2.9 输入与退出

    脚本需要从参数或者直接脚本中定义调用文件时,需要判断文件是否存在

例如:

1



2



3



4



5



6

socket_file=` cat  /etc/my .cnf`| grep  ^ "\bsocket\b" | head  -1| awk  -F "="  '{print $NF}'



if  [[ ! -S $socket_file ]]; then



echo  "获取socket失败...请检查/etc/my.cnf"



echo  "脚本退出..."



exit  1



fi



三、调试

3.1 错误退出

 

1

set  -e

   脚本非注释开头加上set -e,当脚本执行错误时,中断脚本执行,防止脚本发生死循环


3.2脚本语法检查

1

set  -n

  脚本非注释开头加上set -n,读一遍脚本中的命令但不执行,验证脚本是否能正常执行

   

3.3调试

1

set  -x

   脚本非注释开头加上set -x,判断哪里出错。