我不要再擔(dān)心, 自己學(xué)不會 Shell腳本

作為一名經(jīng)常接觸 Linux 的程序員, Shell 腳本是必備的。

然而誕生于上古世紀(jì)的 Shell, 現(xiàn)在已經(jīng)嚴(yán)重落后于時代, 不得不借助一系列最佳實踐,來抵抗其語法方面的脆弱性, 下面是一些總結(jié)。

防御式編程,無奈的選擇

每一個 Shell 腳本, 其文件頭最好加入一些詳細(xì)的說明:

#!/usr/bin/env bash                                           指明 Bash
#
# @date:                                                      創(chuàng)建日期
# @author:                                                    作者
# @license:                                                   授權(quán)信息
#
#                                                             版權(quán)的詳細(xì)聲明
#
#                                                             腳本干嘛用的, 詳細(xì)說明

set -e                                                        腳本某處出錯, 立即退出, 不繼續(xù)執(zhí)行
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH                                                   PATH變量的設(shè)置, 防止子進(jìn)程找不到命令

執(zhí)行一個腳本, 老是出錯, 但是又找不到原因, 這時候就需要 Debug 了:

$ bash -x $file.bash         這樣能展示該文件的詳細(xì)執(zhí)行過程              

基礎(chǔ)語法

變量
        var1=value1                     = 兩邊不能有空格
        var2=value2
        使用變量
            "${var1}"                   推薦做法, 讓你更少出錯( 雖然單詞更多 )
            "${var2}"

數(shù)組
    arr1=( value1 value2 value3 )
    使用數(shù)組
        # 我也不知道為什么要這樣用,但是根據(jù)「無法抵抗就好好享受」之定理,咱們先這樣用著吧
        # 是不是覺得寫法特別惡心?。可倌?,看你有一雙慧眼,不如跟我學(xué)......
        for val in "${arr1[@]}"; do

        done

流程控制
    if [ $condition ]; then
        $statements
    elif [ $condition ]; then
        $statements
    else
        $statements
    fi

    for $var in $array; do
        $statements
    done
    for (( i=0; i < 10; i++)); do
        $statements
    done

    while [ $condition ]; do
        $statements
    done

    until [ $condition ]; do
        $statements
    done

    case $var in
        $first)
            $action ;;
        $second)
            $action ;;
        $third)
            $action ;;
        *)
            $action ;;
    esac

要點:
    1. 注意方括號里面的空格 !

核心之函數(shù)

function $func() {

}

要點
    1. 返回值慎用
    2. 函數(shù)內(nèi)的變量使用局部變量定義
    3. 括號內(nèi)沒有形參

function my_func() {
    local var1=value1

    echo "func name: $0"
    echo "first parameter: $1"
    echo "second parameter: $2"
    echo "all parameters: ${[@]}"
}

函數(shù)使用
    my_func $1 $2

規(guī)范的腳本示例

    #!/usr/bin/env bash
    #
    # @date:      2016/11/11
    # @author:    he.zhiming
    # @license:   BSD
    #
    # Use BSD License
    #
    # Example shell script, for test.

    set -e
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH

    var1="value1"
    var2="value2"
    arr1=( "val1" "val2" "val3" )

    if [ -e "${var1}" ] || [ -e "${var2}" ]; then
        echo "${var1}"
    elif [ -e "${var2}" ] && [-e "${var1}" ]; then
        echo "${var2}"
    else
        echo "nothing"
    fi

    for val in "${arr1[@]}"; then
        echo ${val}
    done

    while [ "" == "" ]; then
        echo "${var1} == ${var2}"
    done

    [[ -d "$dirname" ]] && cd $dirname && rm *                             # 這一句處處體現(xiàn)了 Shell 的防御式編程

請個好幫手

Shell 真的是太脆弱了, 不得不請更多大神來幫忙。

這時候 shellcheck 就上場了( 聽說是Haskell 寫的) , 它是專門檢查你的 Shell 腳本的,并且給出規(guī)范建議。
使用 shellcheck 之后,幸福感暴增!它就像一個長者,總是默默地在一旁,不厭其煩地指出你的錯誤,從不來脾氣(上了老司機(jī)的車,就是爽啊...)。

shellcheck使用:

安裝
    sudo apt-get install shellcheck
使用
    shellcheck $file.bash
最后編輯于
?著作權(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)容

  • 本文全面系統(tǒng)地介紹了shell腳本調(diào)試技術(shù),包括使用echo, tee, trap等命令輸出關(guān)鍵信息,跟蹤變量的值...
    liuzg0734閱讀 993評論 0 14
  • 建立一個腳本 Linux中有好多中不同的shell,但是通常我們使用bash (bourne again shel...
    某人在閱讀 2,113評論 0 0
  • 我從小就喜歡大熊貓,想來大家也一樣,國寶嘛,外國人也是被萌得邁不動腿。小時候偶爾在電視上看見大熊貓吃吃睡睡,比看動...
    卿一閱讀 2,308評論 2 1
  • 記錄我人生中最重要的人的往事……… 一天我閑著無聊,隨手翻著朋友圈,看到了一個分享,分享的是一個快手網(wǎng)紅,不得不說...
    沫之如雪閱讀 209評論 0 1
  • 文|域往 親愛的同學(xué)們,大學(xué)四年是人生中最美好的一段時光。在這段時光里,我們會收獲很多人生中美好的東西:更高的學(xué)歷...
    域往閱讀 1,180評論 21 37

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