如何在 Shell 指令碼中執行語法檢查除錯模式
我們開啟了 Shell 指令碼除錯系列文章,先是解釋了不同的除錯選項,下面介紹如何啟用 Shell 除錯模式。
寫完指令碼後,建議在執行指令碼之前先檢查指令碼中的語法,而不是檢視它們的輸出以確認它們是否正常工作。
在本系列的這一部分,我們將瞭解如何使用語法檢查除錯模式。記住我們之前在本系列的第一部分中解釋了不同的除錯選項,在這裡,我們將使用它們來執行指令碼除錯。
啟用 verbose 除錯模式
在進入本指導的重點之前,讓我們簡要地探索下 verbose 模式。它可以用 -v
除錯選項來啟用,它會告訴 shell 在讀取時顯示每行。
要展示這個如何工作,下面是一個示例指令碼來批量將 PNG 圖片轉換成 JPG 格式。
將下面內容輸入(或者複製貼上)到一個檔案中。
#!/bin/bash
#convert
for image in *.png; do
convert "$image" "${image%.png}.jpg"
echo "image $image converted to ${image%.png}.jpg"
done
exit 0
接著儲存檔案,並用下面的命令使指令碼可執行:
$ chmod +x script.sh
我們可以執行指令碼並顯示它被 Shell 讀取到的每一行:
$ bash -v script.sh
顯示shell指令碼中的所有行
在 Shell 指令碼中啟用語法檢查除錯模式
回到我們主題的重點,-n
啟用語法檢查模式。它會讓 shell 讀取所有的命令,但是不會執行它們,它(shell)只會檢查語法。
一旦 shell 指令碼中發現有錯誤,shell 會在終端中輸出錯誤,不然就不會顯示任何東西。
啟用語法檢查的命令如下:
$ bash -n script.sh
因為指令碼中的語法是正確的,上面的命令不會顯示任何東西。所以,讓我們嘗試刪除結束 for 迴圈的 done
來看下是否會顯示錯誤:
下面是修改過的含有 bug 的批量將 png 圖片轉換成 jpg 格式的指令碼。
#!/bin/bash
#script with a bug
#convert
for image in *.png; do
convert "$image" "${image%.png}.jpg"
echo "image $image converted to ${image%.png}.jpg"
exit 0
儲存檔案,接著執行該指令碼並執行語法檢查:
$ bash -n script.sh
檢查 shell 指令碼語法
從上面的輸出中,我們看到我們的指令碼中有一個錯誤,for 迴圈缺少了一個結束的 done
關鍵字。shell 指令碼從頭到尾檢查檔案,一旦沒有找到它(done
),shell 會列印出一個語法錯誤:
script.sh: line 11: syntax error: unexpected end of file
我們可以同時結合 verbose 模式和語法檢查模式:
$ bash -vn script.sh
在指令碼中同時啟用 verbose 檢查和語法檢查
另外,我們可以通過修改指令碼的首行來啟用指令碼檢查,如下面的例子:
#!/bin/bash -n
#altering the first line of a script to enable syntax checking
#convert
for image in *.png; do
convert "$image" "${image%.png}.jpg"
echo "image $image converted to ${image%.png}.jpg"
exit 0
如上所示,儲存檔案並在執行中檢查語法:
$ ./script.sh
script.sh: line 12: syntax error: unexpected end of file
此外,我們可以用內建的 set 命令來在指令碼中啟用除錯模式。
下面的例子中,我們只檢查指令碼中的 for 迴圈語法。
#!/bin/bash
#using set shell built-in command to enable debugging
#convert
#enable debugging
set -n
for image in *.png; do
convert "$image" "${image%.png}.jpg"
echo "image $image converted to ${image%.png}.jpg"
#disable debugging
set +n
exit 0
再一次儲存並執行指令碼:
$ ./script.sh
總的來說,我們應該保證在執行 Shell 指令碼之前先檢查指令碼語法以捕捉錯誤。
請在下面的反饋欄中,給我們傳送關於這篇指導的任何問題或反饋。在這個系列的第三部分中,我們會解釋並使用 shell 追蹤除錯模式。
作者簡介:
Aaron Kili 是一個 Linux 及 F.O.S.S 熱衷者,即將是 Linux 系統管理員、web 開發者,目前是 TecMint 的內容創作者,他喜歡用電腦工作,並熱心分享知識。
via: http://www.tecmint.com/check-syntax-in-shell-script/
作者:Aaron Kili 譯者:geekpi 校對:jasminepeng
相關文章
- 【指令碼】shell語法指令碼
- 如何在 Linux 中以指令碼模式執行 TopLinux指令碼模式
- 使用CHECKSYNTAX命令檢查RMAN指令碼是否存在語法錯誤指令碼
- 執行shell指令碼指令碼
- shell 指令碼的除錯問題指令碼除錯
- crontab執行shell指令碼指令碼
- shell指令碼執行錯誤 $‘\r‘:command not found指令碼
- 從一個shell指令碼執行出錯聊起指令碼
- RMAN中檢查指令碼語法錯誤的命令指令碼
- 執行Shell指令碼的方式指令碼
- 如何在Visual Studio中執行和除錯彙編程式碼?除錯
- 巧用shell生成資料庫檢查指令碼資料庫指令碼
- 執行Shell指令碼的方式(轉)指令碼
- Mac 終端執行 shell 指令碼Mac指令碼
- 比特幣原始碼分析:多執行緒檢查指令碼比特幣原始碼執行緒指令碼
- Shell指令碼中執行sql語句操作MySQL資料庫的幾個方法指令碼MySql資料庫
- bash shell指令碼執行方法總結指令碼
- 使用CRONTAB呼叫shell指令碼執行EXP指令碼
- Linux下如何執行Shell指令碼Linux指令碼
- 如何在Shell指令碼中逐行讀取檔案指令碼
- Linux中執行Shell指令碼的方式(三種方法)Linux指令碼
- shell 指令碼寫法:指令碼
- Linux shell:執行shell指令碼的幾種方式Linux指令碼
- Linux Shell程式設計(3)——執行shell指令碼Linux程式設計指令碼
- sh指令碼執行報錯指令碼
- Shell 指令碼語句指令碼
- 執行shell指令碼報錯:-bash: ./test1.sh: /bin/bash^M: ...指令碼
- 程式碼執行除錯框除錯
- 詳解shell中source、sh、bash、./執行指令碼的區別指令碼
- 如何在C#中除錯LINQ查詢C#除錯
- 執行 shell 指令碼 \r 問題解決指令碼
- shell指令碼linux命令連續執行指令碼Linux
- shell指令碼的執行環境變數指令碼變數
- AngularJs中,如何在render完成之後,執行Js指令碼AngularJS指令碼
- C語言程式設計十大建議——語法語義篇:使用指令碼檢查部分語義錯誤C語言程式設計指令碼
- lua~IDEA中除錯lua指令碼Idea除錯指令碼
- 史上最全shell指令碼程式設計語法上冊指令碼程式設計
- SQL語句執行進度檢查SQL