軟體特攻隊|shell腳本小技巧,教你寫出健壯可靠的腳本

2021-01-07 軟體特攻隊

作為一個程式設計師,寫shell腳本是常有的事。然而什麼樣的shell腳本?什麼態度去寫shell腳本?是我們需要思考的事。如果抱著能跑就行的態度,也許很容易,但是從腳本的健壯性和可靠性上出發,那麼就不是一件容易的事,以下是幾點小技巧。

1、語法檢查

這是最基本的一點,寫shell腳本時,最有效的就是使用相應的工具進行語法自動補全,自動檢查。這樣才能最大程度發現shell腳本中存在的語法錯誤,

2、腳本失敗時即退出

在每一個腳本頭部進行如下設置:

set -e

舉個例子:

#!/bin/bashset -elp #這裡運行會出錯date

遇到這種情況,腳本在運行時一旦出現錯誤就會退出;

$ ./test.shlp: Error - no default destination available.

當然,某些情況下,我們在執行命令遇到失敗時,仍希望它繼續執行下去,這時候就可以臨時加上|| true;

#!/bin/bashset -elp || true date

不過這樣的設置用處不大,很多時候邏輯是需要處理不同的錯誤情況,而這樣要麼錯誤退出,要么正確進行下去,導致無法進入異常狀態的分支。

這種情況下,就可以通過set +e設置回來:

set -e#commandset +e#other command

3、列印腳本執行過程

代碼一定會遇到調試,而要想知道腳本運行時執行了那些命令,每條命令具體執行了什麼,首先可以利用以下命令來執行腳本:

sh -x test.sh

或者直接在腳本開頭添加set -x:

#!/bin/bashset -xif [ $# -lt 1 ]thenecho "no para"else echo "para 1 $1"fi

執行時,輸出如下:

+ [ 0 -le 1 ]+ echo no parano para

輸入結果中帶有+的內容就是實際執行的命令,而且可以清晰的看到比較條件,變量被展開,具體走到了那個分支。

4、顯示未定義的變量

在shell中變量沒有定義,而我們仍然可以使用,但是使用的結果可能不盡人意。

#!/bin/bashif [ "$var" = "abc" ]thenecho " not abc"else echo " abc "fi

這段腳本本來想判斷var的內容是否等於「abc」,而實際上並沒有定義var,而腳本運行到這裡並不會報錯。這時候我們想早點發現這類問題,以減少在複雜的腳本中消耗的精力,可以在開頭加上:

set -u

再次運行就會提示:

test.sh: 5: test.sh: num: parameter not set

再想像一下,你本來想刪除:

rm -rf $dir/*

然後dir是空的時候,變成了什麼?

是不是有種後背發涼的感覺?

5、管道命令一個失敗時整個失敗

有時候我們可能會執行類似這樣的命令:

cat test.sh |grep if | cut -d ';' -f 2

三條命令一行執行,如果我們希望在其中一條失敗,整個命令就失敗,而避免執行後面無意義的命令,那麼可以在開始設置:

set -o pipefail

不設置的情況下,cat test.sh即使執行失敗了,後面的grep實際上還會繼續執行,可能會導致一些意想不到的情況發生,如果不想這樣的情況發生,那麼這樣設置是有幫助的。

6、對於靜態變量使用readonly

通常我們會在腳本開頭定義一些靜態變量:

MY_PATH=/usr/bin

而為了避免MY_PATH被意外修改,可以這樣:

readonly MY_PATH=/usr/bin

這樣的話,一旦後面有命令嘗試修改,就會報錯。

#!/bin/bashreadonly MY_PATH=/usr/binMY_PATH=/usr/local/bin

運行一下試試:

$ ./test.shtest.sh: 3: test.sh: MY_PATH: is read only

看,給你提示了!

7、給變量設置可選的初始值

例如:

name=${1:-shouwang}echo "${name}"

這裡讓name為$1,即第一個參數,而當它為空時,令name為shouwang。

8、多條命令執行使用&&

例如:

cmd0;cmd1;cmd1

這裡如果cmd0失敗了,後面的命令仍然會執行,而如果不希望後面的命令執行,可以使用:

cmd0 && cmd1 && cmd1

9、使用函數

腳本本身比較短還好,而腳本一旦變長,不使用函數,將使得腳本很難維護,可讀性也很差。

10、總結

實際上最開始介紹的腳本檢查工具就已經非常有效了,基本的錯誤都能檢查出來,而其他的內容,更多的是關注於腳本調試,不放過任何一個可能的錯誤。

最後,還是優先推薦shellcheck工具。

歡迎關注軟體特攻隊!

相關焦點

  • 《Linux shell腳本攻略》限免
    任何初學者都可以在網上輕鬆獲取Linux、Linux shel相關的基礎教程,而就如何運用shell來解決現實世界中的問題,相關的知識和技巧大多都散落在論壇或博客中,要麼不夠全面系統,要麼不易查找。如果你也有此煩惱,不如看看《Linux shell腳本攻略》這本書。
  • Linux下高效編寫shell腳本的10個建議
    shell腳本的編寫應該是一個必備的基本技能了,本文將分享 10 個寫出高效可靠的 shell腳本的實用技巧本文主要內容來源於《10 Useful Tips for Writing Effective Bash Scripts in Linux》,再加上自己的一點理解而成。
  • shell腳本極簡教程
    Linux使用它作為默認的shell是因為它有諸如以下的特色:sh:sh 由Steve Bourne開發,是Bourne Shell的縮寫,sh 是Unix 標準默認的shell。ash:ash shell 是由Kenneth Almquist編寫的,Linux中佔用系統資源最少的一個小shell,它只包含24個內部命令,因而使用起來很不方便。
  • Linux shell腳本編程入門系列一:認識shell腳本
    1、什麼是shell腳本將多個shell命令按語法組合在一起,並保存在文本文件中即得到我們所說的shell腳本(shell script)。shell腳本可以方便地與系統交互,完成系統管理以及批處理任務。shell處於作業系統與應用之間,起到橋梁的作用。
  • Linux中Shell腳本基礎筆記
    shell腳本都是以"#!"作為開頭。這是腳本開始的標記,它是告訴linux系統執行該腳本文件需要使用相應的解釋器,緊挨著的/bin/bash指定了解釋器的具體路徑。shell主要用#作為注釋標記。後面可以加腳本的注釋,建議寫shell腳本要根據情況多寫注釋,便於以後腳本的維護。shell腳本的運行方式:1、可以在shell腳本第一行加上"#!/bin/bash"的話。可以按照以下方式執行:bash test.sh #要保證目錄中存在該腳本文件。2、給腳本加上可執行的權限,然後使用".
  • 資料|《Linux 命令行與 shell 腳本編程大全》
    今日資料推薦《 Linux 命令行與 shell 腳本編程大全》這是一本關於 Linux 命令行與 shell 腳本編程的全方位教程,主要包括四大部分:Linux 命令行,shell 腳本編程基礎,高級 shell 腳本編程,如何創建實用的 shell 腳本。
  • 什麼是Shell腳本?為什麼要學習Shell?
    Shell腳本語言是實現Linux/UNIX系統管理及自動化運維所必備的重要工具, Linux/UNIX系統的底層及基礎應用軟體的核心大都涉及Shell腳本的內容。每一個合格 的Linux系統管理員或運維工程師,都需要能夠熟練地編寫Shell腳本語言,並能夠閱 讀系統及各類軟體附帶的Shell腳本內容。
  • 寫出健壯的 Bash 腳本 - OSCHINA - 中文開源技術交流社區
    許多人用shell腳本完成一些簡單任務,而且變成了他們生命的一部分。不幸的是,shell腳本在運行異常時會受到非常大的影響。
  • Shell腳本編程總結及速查手冊
    代替)執行文件通常情況下, 最方便的方式就是方式1, 通過方式1執行你需要在腳本第一行寫好這段腳本由哪個解釋器來解釋, 而通過方式2來執行則沒有這個限制, 寫了也沒用.fi除[]之外, shell語言中還有幾種其它括號, 比如: 單小括號/雙小括號/雙中括號/… , 不同的括號有不同的用法, 更多關於shell中, 括號的用法可以看看這個switch流程控制當條件較多時, 可以選擇使用switch語句, shell中的switch
  • 平常使用shell腳本的一些知識點分享
    例如,第一個參數是$1,第二個參數是$2$# 傳遞給腳本或函數的參數個數$* 傳遞給腳本或函數的所有參數$@ 傳遞給腳本或函數的所有參數。被雙引號(" ")包含時,與 $* 稍有不同$?5. grep過濾多個參數實例:PRO_NAME=ProbeIPTVgrep -E "$PRO_NAME|System"6.shell
  • SHELL腳本必知必會
    上面只是一個非常小的例子,實際應用的時候由於這個細節導致的問題實在是太多了。。。巧用main函數我們知道,像java,C這樣的編譯型語言都會有一個函數入口,這種結構使得代碼可讀性很強,我們知道哪些直接執行,那些是函數。但是腳本不一樣,腳本屬於解釋性語言,從第一行直接執行到最後一行,如果在這當中命令與函數糅雜在一起,那就非常難讀了。
  • linux shell 腳本入門
    Linux 腳本編寫基礎1.1 語法基本介紹1.1.1 開頭程序必須以下面的行開始(必須方在文件的第一行):#!/bin/sh符號#!用來告訴系統它後面的參數是用來執行該文件的程序。在這個例子中我們使用/bin/sh來執行程序。當編輯好腳本時,如果要執行該腳本,還必須使其可執行。
  • 編寫Linux Shell腳本的最佳實踐
    前言 由於工作需要,最近重新開始拾掇shell腳本。雖然絕大部分命令自己平時也經常使用,但是在寫成腳本的時候總覺得寫的很難看。而且當我在看其他人寫的腳本的時候,總覺得難以閱讀。
  • 【shell】shell 腳本編程基礎
    初識1.1 第一個 shell 腳本1.2 運行 shell 腳本的兩種方法2. 變量2.1 變量2.2 字符串2.3 數組2.4 注釋3. 傳遞參數4.初識1.1 第一個 shell 腳本test.sh :#!/bin/bashecho "Hello,World"#! 告訴系統其後路徑所指定的程序即是解釋此腳本文件的 Shell 程序。
  • 不懂什麼是shell腳本?看完本文你一定就懂了
    小編本人也非常喜歡看各種linux系統的文章,其中有一個詞叫做shell,小編開始就是不明白什麼意思。好奇之餘還特別用翻譯軟體翻譯了這個詞,其中的解釋是「外殼、貝殼」,看了更讓我糊塗。下面我們來看下這張圖,可以幫助我們理解這個詞語!
  • Linux——Shell腳本的應用1(基礎)
    Shell腳本的應用(基礎)簡介:隨著linux系統在企業中的應用越來越多,伺服器的自動化管理也變得越來越重要。在linux伺服器的自動化維護工作中,除了計劃任務的設置以外,shell腳本的應用也是非常重要的一部分。
  • shell腳本的使用該熟練起來了,你說呢?(篇一)
    Shell 主要用來開發一些實用的、自動化的小工具,而不是用來開發具有複雜業務邏輯的中大型軟體,例如檢測計算機的硬體參數、搭建 Web 運行環境、日誌分析等,Shell 都非常合適。使用 Shell 的熟練程度反映了用戶對 Linux 的掌握程度,運維工程師、網絡管理員、程式設計師都應該學習 Shell。
  • 為什麼Shell腳本執行不成功?原來是這樣
    其實,Shell腳本的書寫和執行都有很多注意事項的,因為我們平時使用的少,所以沒有注意到,今天小編就帶大家來一一熟悉下吧!1、「#!」使用有講究#!這一組符號如果出現在腳本的第一行,代表的是指定該shell腳本用哪種類型的shell來解釋和執行,即指定解釋器。如果#!這個符號出現的位置不是第一行,那麼代表這一行是注釋行,腳本不執行。如下圖所示,#!
  • 平常寫shell腳本遇到的問題匯總
    最近也是在linux下寫了很多的shell腳本,之前也自己總結過遇到的一些問題及解決方法,最近又遇到並且整理了一下,下面簡單說下最近遇到的問題以及解決方法。."[: too many arguments"錯誤問題:最近在寫 shell腳本的時候發現了這樣一個問題:PID=`cat ****`while [ !
  • linux系統shell腳本基本及變量
    shell是啥1、腳本語言,可以用來編寫腳本。shell script shell腳本(劇本),面向過程的語言。腳本-->一條條命令的羅列。查看變量本地變量:只能在當前shell中調用的變量環境變量:不僅能在當前shell中使用,而且還可以在子shell中使用的變量