歡迎光臨
每天分享高質量文章

如何在 Linux 或者 UNIX 下除錯 Bash Shell 腳本 | Linux 中國

我寫了一個 hello world 小腳本。我如何能除錯運行在 Linux 或者類 UNIX 的系統上的 bash shell 腳本呢?
— Vivek Gite


本文導航
編譯自 | https://www.cyberciti.biz/tips/debugging-shell-script.html 
 作者 | Vivek Gite
 譯者 | zjon

來自我的郵箱:

我寫了一個 hello world 小腳本。我如何能除錯運行在 Linux 或者類 UNIX 的系統上的 bash shell 腳本呢?

這是 Linux / Unix 系統管理員或新用戶最常問的問題。shell 腳本除錯可能是一項繁瑣的工作(不容易閱讀)。除錯 shell 腳本有多種方法。

您需要傳遞 -x 或 -v 引數,以在 bash shell 中瀏覽每行代碼。

如何在 Linux 或者 UNIX 下除錯 Bash Shell 腳本

讓我們看看如何使用各種方法除錯 Linux 和 UNIX 上運行的腳本。

-x 選項來除錯腳本

用 -x 選項來運行腳本:

  1. $ bash -x script-name

  2. $ bash -x domains.sh

使用 set 內置命令

bash shell 提供除錯選項,可以打開或關閉使用 set 命令[1]

◈ set -x : 顯示命令及其執行時的引數。
◈ set -v : 顯示 shell 輸入行作為它們讀取的

可以在 shell 腳本本身中使用上面的兩個命令:

  1. #!/bin/bash

  2. clear

  3. # turn on debug mode

  4. set -x

  5. for f in *

  6. do

  7.   file $f

  8. done

  9. # turn OFF debug mode

  10. set +x

  11. ls

  12. # more commands

你可以代替 標準釋伴[2] 行:

  1. #!/bin/bash

用以下代碼(用於除錯):

  1. #!/bin/bash -xv

使用智慧除錯功能

首先添加一個叫做 _DEBUG 的特殊變數。當你需要除錯腳本的時候,設置 _DEBUG 為 on

  1. _DEBUG="on"

在腳本的開頭放置以下函式:

  1. function DEBUG()

  2. {

  3. [ "$_DEBUG" == "on" ] &&  $@

  4. }

現在,只要你需要除錯,只需使用 DEBUG 函式如下:

  1. DEBUG echo "File is $filename"

或者:

  1. DEBUG set -x

  2. Cmd1

  3. Cmd2

  4. DEBUG set +x

當除錯完(在移動你的腳本到生產環境之前)設置 _DEBUG 為 off。不需要刪除除錯行。

  1. _DEBUG="off" # 設置為非 'on' 的任何字符

示例腳本:

  1. #!/bin/bash

  2. _DEBUG="on"

  3. function DEBUG()

  4. {

  5. [ "$_DEBUG" == "on" ] &&  $@

  6. }

  7. DEBUG echo 'Reading files'

  8. for i in *

  9. do

  10.  grep 'something' $i > /dev/null

  11.  [ $? -eq 0 ] && echo "Found in $i file"

  12. done

  13. DEBUG set -x

  14. a=2

  15. b=3

  16. c=$(( $a + $b ))

  17. DEBUG set +x

  18. echo "$a + $b = $c"

儲存並關閉檔案。運行腳本如下:

  1. $ ./script.sh

輸出:

  1. Reading files

  2. Found in xyz.txt file

  3. + a=2

  4. + b=3

  5. + c=5

  6. + DEBUG set +x

  7. + '[' on == on ']'

  8. + set +x

  9. 2 + 3 = 5

現在設置 _DEBUG 為 off(你需要編輯該檔案):

  1. _DEBUG="off"

運行腳本:

  1. $ ./script.sh

輸出:

  1. Found in xyz.txt file

  2. 2 + 3 = 5

以上是一個簡單但非常有效的技術。還可以嘗試使用 DEBUG 作為別名而不是函式。

除錯 Bash Shell 的常見錯誤

Bash 或者 sh 或者 ksh 在屏幕上給出各種錯誤信息,在很多情況下,錯誤信息可能不提供詳細的信息。

跳過在檔案上應用執行權限

當你 編寫你的第一個 hello world 腳本[3],您可能會得到一個錯誤,如下所示:

  1. bash: ./hello.sh: Permission denied

設置權限使用 chmod 命令:

  1. $ chmod +x hello.sh

  2. $ ./hello.sh

  3. $ bash hello.sh

檔案結束時發生意外的錯誤

如果您收到檔案結束意外錯誤訊息,請打開腳本檔案,並確保它有打開和關閉引號。在這個例子中,echo 陳述句有一個開頭引號,但沒有結束引號:

  1. #!/bin/bash

  2. ...

  3. ....

  4. echo 'Error: File not found

  5.                           ^^^^^^^

  6.                           missing quote

還要確保你檢查缺少的括號和大括號 {}

  1. #!/bin/bash

  2. .....

  3. [ ! -d $DIRNAME ] && { echo "Error: Chroot dir not found"; exit 1;

  4.                                                                    ^^^^^^^^^^^^^

  5.                                                                    missing brace }

  6. ...

丟失像 fi,esac,;; 等關鍵字。

如果你缺少了結尾的關鍵字,如 fi 或 ;; 你會得到一個錯誤,如 “XXX 意外”。因此,確保所有嵌套的 if 和 case 陳述句以適當的關鍵字結束。有關語法要求的頁面。在本例中,缺少 fi

  1. #!/bin/bash

  2. echo "Starting..."

  3. ....

  4. if [ $1 -eq 10 ]

  5. then

  6.   if [ $2 -eq 100 ]

  7.   then

  8.      echo "Do something"

  9. fi

  10. for f in $files

  11. do

  12.  echo $f

  13. done

  14. # 註意 fi 丟失了

在 Windows 或 UNIX 框中移動或編輯 shell 腳本

不要在 Linux 上創建腳本並移動到 Windows。另一個問題是編輯 Windows 10上的 shell 腳本並將其移動到 UNIX 服務器上。這將由於換行符不同而導致命令沒有發現的錯誤。你可以使用下列命令 將 DOS 換行轉換為 CR-LF 的Unix/Linux 格式[4] :

  1. dos2unix my-script.sh

技巧

技巧 1 - 發送除錯信息輸出到標準錯誤

[標準錯誤] 是預設錯誤輸出設備,用於寫所有系統錯誤信息。因此,將訊息發送到預設的錯誤設備是個好主意:

  1. # 寫錯誤到標準輸出

  2. echo "Error: $1 file not found"

  3. #

  4. # 寫錯誤到標準錯誤(註意 1>&2 echo 命令末尾)

  5. #

  6. echo "Error: $1 file not found" 1>&2

技巧 2 - 在使用 vim 文本編輯器時,打開語法高亮

大多數現代文本編輯器允許設置語法高亮選項。這對於檢測語法和防止常見錯誤如打開或關閉引號非常有用。你可以在不同的顏色中看到。這個特性簡化了 shell 腳本結構中的編寫,語法錯誤在視覺上截然不同。高亮不影響文本本身的意義,它只為你提示而已。在這個例子中,我的腳本使用了 vim 語法高亮:

!如何除錯 Bash Shell 腳本,在 Linux 或者 UNIX 使用 Vim 語法高亮特性[5]]7[5]

技巧 3 - 使用 shellcheck 檢查腳本

shellcheck 是一個用於靜態分析 shell 腳本的工具[6]。可以使用它來查找 shell 腳本中的錯誤。這是用 Haskell 編寫的。您可以使用這個工具找到警告和建議。你可以看看如何在 Linux 或 類UNIX 系統上安裝和使用 shellcheck 來改善你的 shell 腳本,避免錯誤和高效。

作者:Vivek Gite

作者是 nixCraft 創造者,一個經驗豐富的系統管理員和一個練習 Linux 操作系統/ UNIX shell 腳本的教練。他曾與全球客戶和各種行業,包括 IT,教育,國防和空間研究,以及非營利部門。關註他的 推特[7]臉譜網[8]谷歌+ [9]


via: https://www.cyberciti.biz/tips/debugging-shell-script.html

作者:Vivek Gite[11] 譯者:zjon 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

LCTT 譯者

zjon ? ?
共計翻譯:3 篇
貢獻時間:28 天


推薦文章

< 左右滑動查看相關文章 >

點擊圖片、輸入文章 ID 或識別二維碼直達

赞(0)

分享創造快樂

© 2021 知識星球   网站地图