vim創(chuàng)建腳本自動添加注釋信息

Shell代碼規(guī)范

關(guān)于注釋

程序頭應(yīng)加注版本與功能說明的注釋。但程序第一行不能漢字。
程序體中應(yīng)包含必要的注釋,注釋說明如下:

單行注釋,可以放在代碼行的尾部或代碼行的上部;
多行注釋,用于注解復(fù)雜的功能說明,可以放在程序體中,也可以放在代碼塊的開始部分
代碼修改時,對修改的內(nèi)容要加必要版本注釋及功能說明。

命名約定

1.本文檔的命名約定是系統(tǒng)配置文件、腳本文件;
2.文件名、變量名、函數(shù)名不超過20個字符;
3.命名只能使用英文字母,數(shù)字和下劃線,只有一個英文單詞時使用全拼,有多個單詞時,使用下劃線分隔,長度較長時,可以取單詞前3~4個字母。
4.文件名全部以小寫命名,不能大小寫混用(通過U盤交換文件時,大小寫可能會丟失,即:大寫文件名可能會全部變成小寫文件名);
5.避免使用Linux的保留字如true、關(guān)鍵字如PWD等(見附表);
6.從配置文件導(dǎo)出配置時,要注意過濾空行和注釋

函數(shù)約定

函數(shù)名稱應(yīng)該采用小寫的形式,并且有一個很好的意義。函數(shù)名稱應(yīng)該容易讓人理解,比如f1這個名稱雖然容易輸入但是對調(diào)試和其它人閱讀代碼造成了很大的困難,它說明不了任何東西。好的函數(shù)名稱可以幫助說明代碼,而不需要額外的注釋。
一個或多或少有趣的是:如果你無意這樣做,不要把函數(shù)名稱命名為常見的命令名,新手往往比較容易將腳本或者函數(shù)名命名成test,這樣就和UNIX的test命令沖突了。
除非絕對必要,僅使用字母、數(shù)字和下劃線作為函數(shù)名稱。
每個函數(shù)控制在50-100行,超出行數(shù)建議分成兩個函數(shù)
多次反復(fù)調(diào)用的程序最好分成函數(shù),可以簡化程序,使程序條理更清楚
所有函數(shù)定義應(yīng)該在腳本主要代碼執(zhí)行之前,這樣可以給人全局的印象,并且確保所有函數(shù)在使用之前它是已知的。
你應(yīng)該使用可移植性高的函數(shù)定義形式,即不帶function關(guān)鍵字的形式。

代碼開頭約定

1、第一行一般為調(diào)用使用的語言
2、下面要有這個程序名,避免更改文件名為無法找到正確的文件
3、版本號
4、更改后的時間
5、作者相關(guān)信息
6、該程序的作用,及注意事項
7、版權(quán)與是否開放共享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

縮進

由于Shell沒有很好的編輯環(huán)境,所以,建議用四個空格為基數(shù)進行縮進,好處在不同的環(huán)境下TAB可能代表的空格數(shù)不同,造成代碼的錯亂。用TAB他的優(yōu)點是速度快方便,可以在編輯的時候也用TAB,但需要轉(zhuǎn)換。
可以在更改編輯器,Windows的就不說了,主要是VIM
:set softtabstop=4
注意不要使用 :set tabstop=4 上面那個是同時把這一個TAB轉(zhuǎn)換為四個空格,而這一條是定義TAB為四個空格,如果到其它編輯器上就會看到默認8個空格的情況,那就會不美觀了。
另外將原有的TAB轉(zhuǎn)換為空格,:retab
如果想讓剛才的配置永久生效需要改動vim的配置文件 vim ~/.vimrc,更多詳細的有用的配置見“VIM配置總結(jié)”

分隔長行

每行不要超過80字,如果超出,建議用“\”折行,有管道的命令行除外。
如果需要分隔過長的代碼,你可以使用下面的任意一種方法:
1) 使用與命令寬度相同的縮進

activate some_very_long_option \
        some_other_option

2) 使用2個空格縮進

activate some_very_long_option \
  some_other_option

從個人的角度來說,除非有特別的需要,我更傾向于第一種形式,因為它突出“上下兩行的內(nèi)容是一起的”這一聯(lián)系。

分離復(fù)合命令

譯者注:其實這里的復(fù)合命令就是指塊語句,例如for/while循環(huán), if分支結(jié)構(gòu)等等。

HEAD_KEYWORD parameters; BODY_BEGIN
  BODY_COMMANDS
BODY_END

我習慣于:
將HEAD_KEYWORD和初始化命令或者參數(shù)放在第一行;
將BODY_BEGIN同樣放在第一行;
復(fù)合命令中的BODY部分以4個空格縮進;
BODY_END部分獨立一行放在最后;

if/then/elif/else分支語句

if ...; then
    ...
elif ...; then
    ...
else
    ...
fi

for循環(huán)

for f in /etc/*; do
    ...
done

while/until循環(huán)

while [[ $answer != [YyNn] ]]; do
    ...
done

case分支語句

case $input in
    hello)
        echo "You said hello"
        ;;
    bye)
        echo "You said bye"
        if foo; then
            bar
        fi
        ;;
    *)
        echo "You said something weird..."
        ;;
esac

幾點注意的地方:
如果不是100%需要,匹配部分左右的括號不需要寫(譯者注:例如寫成hello)而不是(hello));
匹配模式與分支的終止符號;;位于同一縮進級別
分支內(nèi)部的命令多縮進一層;
盡管是可選的,這里還是把最后一個分支的終止符號也寫上了;

參數(shù)展開

除非你知道自己做的事情,請在參數(shù)展開的地方使用雙引號
當然,也有一些地方并不需要使用雙引號,例如:
[[ ]]測試表達式內(nèi)部是不會展開的;
在case WORD in語法中WORD也不會展開的; 在變量賦值var=WORD的地方也是不會展開的 但是在這些地方使用引號并不會出錯,如果你習慣于在每個可能展開參數(shù)的地方使用引號,你寫得代碼會很安全。
如果你要傳遞一個參數(shù)作為一個單詞列表,你可以不使用引號,例如:

list="one two three"
# you MUST NOT quote $list here
for word in $list; do
    ...
done

命令替換

正如文章the article about command substitution [Bash Hackers Wiki]中提及的,你應(yīng)該使用$( .. )形式。
不過,如果可移植性是一個問題,你可能必須使用反引號的形式…。
在任何情況,如果其它展開或者單詞分隔并不是你期望的,你應(yīng)該將命令替換用雙引號引起來。

環(huán)境變量

變量:全部是大寫字母
變量引用:全部以變量名加雙引號引用,如”TERMTYPE”,或“{TERMTYPE}”,如果變量類型是數(shù)值型不引用,如:
如果需要從配置文件導(dǎo)出變量,則在變量前加一大寫字母,以識別導(dǎo)出變量與自定義環(huán)境變量的區(qū)別,如:
變量值的引用盡量以開頭,如(ls inst_.sh),避免使用ls inst_。sh
循環(huán)控制變量可以命名為單個字母, 比如 i、j等。 也可以是更有意義的名稱, 比如 UserIndex。
環(huán)境變量和全局變量 在腳本開頭定義。
函數(shù)中使用較多的文件,以環(huán)境變量的形式在文件開頭定義,僅函數(shù)中使用的變量在函數(shù)開頭定義
配置變量
在這里,我將這一類變量——可以被用戶更改的——叫做配置變量。
讓這類變量容易找到,一般放在腳本的頭部,給它們有意義的名稱并且加上注釋說明。正如上面說的,僅當你知道你為什么這么做的時候,才用大寫的變量名形式,否則小寫形式更加安全。
語句
if 語句
if/then/else 語句中最可能被執(zhí)行的部分應(yīng)該放在 then 子句中, 不太可能被執(zhí)行的部分應(yīng)該放在 else 子句中。
如果可能, 盡量不要使用一連串的 if 語句, 而應(yīng)該以 case 語句替代。
不要使 if 語句嵌套超過5層以上, 盡量以更清楚的代碼替代。
case 語句
概要
case 語句中的單個子句應(yīng)該以 case 常數(shù)的數(shù)字順序或字母順序排列。 子句中的執(zhí)行語句應(yīng)該盡量保持簡單, 一般不要超過4到5行代碼。 如果執(zhí)行語句過于復(fù)雜, 應(yīng)該將它放置在獨立的函數(shù)中。
case 語句的 *) 子句應(yīng)該只在正常的默認情況或檢測到錯誤的情況下使用。
格式
case 語句遵循同樣的縮進和命名約定。
while 語句
使用 Exit 過程退出 while 循環(huán)是不好的; 如果可能, 應(yīng)該只使用循環(huán)條件來結(jié)束循環(huán)。
while 循環(huán)的所有初始化代碼應(yīng)該緊貼在進入 while 循環(huán)之前, 不要被其他無關(guān)語句分隔開。
循環(huán)結(jié)束后的處理應(yīng)該緊跟在循環(huán)之后。
for 語句
如果需要執(zhí)行確定次數(shù)的增量循環(huán), 應(yīng)該用 for 語句替代 while 語句。
腳本的基本結(jié)構(gòu)
一個腳本的基本結(jié)構(gòu)是這樣的:

#!SHEBANG
CONFIGURATION_VARIABLES
FUNCTION_DEFINITIONS
MAIN_CODE
Shebang

如果可能,請不要忘記shebang。
請小心使用/bin/sh作為shebang,在Linux系統(tǒng)中,/bin/sh就是Bash這是一個錯誤的觀點。
于我而言,shebang有兩個目的:
說明直接執(zhí)行時以哪個解釋器來執(zhí)行;
明確該腳本應(yīng)該以哪個解釋器來執(zhí)行;
腳本行為和健壯性
當腳本檢測到問題時盡早退出,以免執(zhí)行潛在的問題; 如果你需要用到的命令可能并沒有安裝在系統(tǒng)上,在腳本執(zhí)行的時候最好檢查命令是否存在并且提醒用戶缺少什么; 采用有意義的腳本返回值,例如0代碼成功,1代碼錯誤或者失??;
其它
輸出內(nèi)容
if the script is interactive, if it works for you and if you think this is a nice feature, you can try to save the terminal content and restore it after execution;(譯者注:不理解這一點是什么意思) 在屏幕中輸出簡單易理解的消息; 使用顏色或者特別的前綴區(qū)分錯誤和警告信息; 輸出正常的內(nèi)容到STDOUT,而輸出錯誤、警告或者診斷的信息到STDERR; 在日志文件中輸出所有詳細的信息;
輸入
不要盲目地假設(shè)任何事情,如果你希望用戶輸入一個數(shù)字,請在腳本中主動檢查它是否真得是一個數(shù)字,檢查頭部是否包含0,等等。我們都應(yīng)該知道這一點,用戶僅僅是用戶而不是程序員,他們會做他們想要的,而不是程序想要的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容