目錄
前言:
一、命名規範
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,判斷哪裏出錯。