如何在 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 腳本之前先檢查腳本語法以捕捉錯誤。
原文發布時間為:2017-12-19
本文來自雲棲社區合作夥伴“Linux中國”
最後更新:2017-06-06 07:37:18
上一篇:
慢動作輸出 Linux 命令結果並用彩色顯示
下一篇:
CentOS 7.3 安裝指南
PostgreSQL物理"備庫"的哪些操作或配置,可能影響"主庫"的性能、垃圾回收、IO波動
Feature extraction - sklearn文本特征提取
C++之拷貝構造函數
Activity在GridView和ListView之間切換使用一個布局實現的方法
Strategies for Effective Database Synchronization
黑客精神祭 挖掘神秘黑客背後的故事
9招教你企業應如何防範勒索軟件
HTAP數據庫 PostgreSQL 場景與性能測試之 26 - (OLTP) NOT IN、NOT EXISTS 查詢
YPbPr 和 YCbCr的區別 .
Swift學習之四:類型別名(Type Aliases)