運維腳本規範

目錄

前言:

一、命名規範

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:       [email protected]
# 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://alarm.51.com&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,判斷哪裏出錯。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章