1. 程式人生 > >如何在 Shell 指令碼中執行語法檢查除錯模式【轉】

如何在 Shell 指令碼中執行語法檢查除錯模式【轉】

我們開啟了 Shell 指令碼除錯系列文章,先是解釋了不同的除錯選項,下面介紹如何啟用 Shell 除錯模式

寫完指令碼後,建議在執行指令碼之前先檢查指令碼中的語法,而不是檢視它們的輸出以確認它們是否正常工作。

在本系列的這一部分,我們將瞭解如何使用語法檢查除錯模式。記住我們之前在本系列的第一部分中解釋了不同的除錯選項,在這裡,我們將使用它們來執行指令碼除錯。

啟用 verbose 除錯模式

在進入本指導的重點之前,讓我們簡要地探索下 verbose 模式。它可以用 -v 除錯選項來啟用,它會告訴 shell 在讀取時顯示每行。

將下面內容輸入(或者複製貼上)到一個檔案中。

  1. #!/bin/bash
  2. #convert
  3. for image in *.png; do
  4. convert "$image" "${image%.png}.jpg"
  5. echo "image $image converted to ${image%.png}.jpg"
  6. done
  7. exit 0

接著儲存檔案,並用下面的命令使指令碼可執行:

  1. $ chmod +x script.sh

我們可以執行指令碼並顯示它被 Shell 讀取到的每一行:

  1. $ bash -v script.sh

顯示shell指令碼中的所有行

顯示shell指令碼中的所有行

在 Shell 指令碼中啟用語法檢查除錯模式

回到我們主題的重點,-n

 啟用語法檢查模式。它會讓 shell 讀取所有的命令,但是不會執行它們,它(shell)只會檢查語法。

一旦 shell 指令碼中發現有錯誤,shell 會在終端中輸出錯誤,不然就不會顯示任何東西。

啟用語法檢查的命令如下:

  1. $ bash -n script.sh

因為指令碼中的語法是正確的,上面的命令不會顯示任何東西。所以,讓我們嘗試刪除結束 for 迴圈的 done 來看下是否會顯示錯誤:

下面是修改過的含有 bug 的批量將 png 圖片轉換成 jpg 格式的指令碼。

  1. #!/bin/bash
  2. #script with a bug
  3. #convert
  4. for image in *.png; do
  5. convert "$image" "${image%.png}.jpg"
  6. echo "image $image converted to ${image%.png}.jpg"
  7. exit 0

儲存檔案,接著執行該指令碼並執行語法檢查:

  1. $ bash -n script.sh

檢查 shell 指令碼語法

檢查 shell 指令碼語法

從上面的輸出中,我們看到我們的指令碼中有一個錯誤,for 迴圈缺少了一個結束的 done 關鍵字。shell 指令碼從頭到尾檢查檔案,一旦沒有找到它(done),shell 會打印出一個語法錯誤:

  1. script.sh: line 11: syntax error: unexpected end of file

我們可以同時結合 verbose 模式和語法檢查模式:

  1. $ bash -vn script.sh

在指令碼中同時啟用 verbose 檢查和語法檢查

在指令碼中同時啟用 verbose 檢查和語法檢查

另外,我們可以通過修改指令碼的首行來啟用指令碼檢查,如下面的例子:

  1. #!/bin/bash -n
  2. #altering the first line of a script to enable syntax checking
  3. #convert
  4. for image in *.png; do
  5. convert "$image" "${image%.png}.jpg"
  6. echo "image $image converted to ${image%.png}.jpg"
  7. exit 0

如上所示,儲存檔案並在執行中檢查語法:

  1. $ ./script.sh
  2. script.sh: line 12: syntax error: unexpected end of file

此外,我們可以用內建的 set 命令來在指令碼中啟用除錯模式。

下面的例子中,我們只檢查指令碼中的 for 迴圈語法。

  1. #!/bin/bash
  2. #using set shell built-in command to enable debugging
  3. #convert
  4. #enable debugging
  5. set -n
  6. for image in *.png; do
  7. convert "$image" "${image%.png}.jpg"
  8. echo "image $image converted to ${image%.png}.jpg"
  9. #disable debugging
  10. set +n
  11. exit 0

再一次儲存並執行指令碼:

  1. $ ./script.sh

總的來說,我們應該保證在執行 Shell 指令碼之前先檢查指令碼語法以捕捉錯誤。

請在下面的反饋欄中,給我們傳送關於這篇指導的任何問題或反饋。在這個系列的第三部分中,我們會解釋並使用 shell 追蹤除錯模式。

作者簡介:

Aaron Kili 是一個 Linux 及 F.O.S.S 熱衷者,即將是 Linux 系統管理員、web 開發者,目前是 TecMint 的內容創作者,他喜歡用電腦工作,並熱心分享知識。

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