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,

        解決的方式是在執行的時候命令跟全路徑,或者在腳本的開始,顯式的設置一下PATH 變量,

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

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 腳本內可能包含敏感信息,如服務器密碼或者是數據庫密碼,如果公開之前先確認敏感信息是否已經刪除。

原創文章,作者:忠神通,如若轉載,請注明出處:http://www.www58058.com/73484

(0)
忠神通忠神通
上一篇 2017-04-16 18:47
下一篇 2017-04-16 19:43

相關推薦

  • yum前端工具與源碼編譯安裝

    概述:本章內容重要講解yum(rpm前端工具)和rpm源碼編譯安裝,前者可以有效的解決軟件安裝過程中存在的依賴關系,從而提升我們使用系統的效率;后者是我們進階Linux系統,了解程序包安裝的過程本質 1、YUM: Yellowdog Update Modifier   Yum(全稱為 Yellow dog Updater, Modified)是一個…

    Linux干貨 2016-08-29
  • Linux 基礎知識(六.一)

    一、模式及模式間的切換 (一)模式介紹 1、vim文本編輯器提供了三種基本模式,分別是編輯模式(命令模式)、輸入模式以及末行模式(命令行模式) (二)模式間的切換 二、基礎操作 (一)單文件的打開與關閉 1、單文件的打開:vim [options]… /path/to/somefile 2、單文件打開時的常用選項: (1)+#:表示當文件打開時,…

    Linux干貨 2016-11-14
  • Linux系統中硬鏈接和軟鏈接

    使用對象:linux初學者。   一、硬鏈接和軟鏈接的概念 硬鏈接是給已經存在的數據文件另外創建一個名字,通過該名字也可以訪問該數據文件。就好像給張三起個綽號叫“小二黑”,通過“張三”這個名字能找到這個人,通過“小二黑”這個名字也能找到這個人。        軟鏈接是給文件名在其…

    Linux干貨 2016-10-20
  • Week 1 計算機組成

    I. 引 Introduction     在學習計算機技術之前,了解計算機的組成是非常必要的。這不僅可以讓你對硬件有一個大概的了解,而且會讓你將來對基于硬件運行的軟件有一個更為透徹的理解。只有理解了計算機是如何協調它的部件來工作的才方能理解人們為何這樣設計操作系統和程序。 I. 計算機部件 The Essential…

    Linux干貨 2016-06-11
  • python面向對象

    ##**語言的分類**– 面向機器:匯編語言– 面向過程:c語言– 面向對象:C++ Java Python ##**面向對象**– 類class– 類是抽象的概念,萬事萬物的抽象,是一類事物的共同特征集合。– 對象instance object– 對象是類的具象,是一個實體…

    Linux干貨 2017-11-13
  • 馬哥教育網絡班21期+第14周課程練習

    系統的INPUT和OUTPUT默認策略為DROP; 1、限制本地主機的web服務器在周一不允許訪問;新請求的速率不能超過100個每秒;web服務器包含了admin字符串的頁面不允許訪問;web服務器僅允許響應報文離開本機; INPUT鏈 # iptables -I INPUT 1 -p tcp&nb…

    Linux干貨 2016-11-14

評論列表(1條)

  • renjin
    renjin 2017-04-21 10:22

    主要介紹了一些shell編程的一些書寫規范及示例說明,內容寫的很詳細,排版需要注意,把代碼放入到”插入程序代碼”中去,繼續努力?。?!

欧美性久久久久