Linux Shell腳本調試方法


Shell腳本調試選項

Shell本身提供一些調試方法選項:

  • -n,讀一遍腳本中的命令但不執行,用於檢查腳本中的語法錯誤。
  • -v,一邊執行腳本,一邊將執行過的腳本命令打印到標准輸出。
  • -x,提供跟蹤執行信息,將執行的每一條命令和結果依次打印出來。

使用這些選項有三種方法(注意:避免幾種調試選項混用)

1.在命令行提供參數:

$sh -x debug.sh

2.腳本開頭提供參數:

#!/bin/sh -x

3.在腳本中用set命令啟用or禁用參數:

set -x  # 表示啟用
調試部分的代碼塊
set +x  # 表示禁用

正文部分:

首先查看一下linux默認shell:

由此可知系統默認的shell是bash

---------------------------------華麗分割線---------------------------------

啟用 verbose 調試模式(它可以用 -v調試選項來啟用,它會告訴 shell 在讀取時顯示每行。)

示例腳本:

#!/bin/bash
#批量將 PNG 圖片轉換成 JPG 格式
for image in *.png; do
convert "$image" "${image%.png}.jpg"
echo "image $image converted to ${image%.png}.jpg"
done
exit 0

保存文件,並賦予腳本執行權限:

$ chmod +x debug.sh

執行腳本並顯示它被 Shell 讀取到的每一行:

$ bash -v debug.sh

 

顯示shell腳本中的所有行

在 Shell 腳本中啟用語法檢查調試模式

回到重點,-n激活語法檢查模式。它會讓 shell 讀取所有的命令,但是不會執行它們,它(shell)只會檢查語法。

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

激活語法檢查的命令如下:

$ bash -n debug.sh

因為腳本中的語法是正確的,上面的命令不會顯示任何東西。所以,嘗試刪除結束 for 循環的 done來看下是否會顯示錯誤:

下面是修改過的含有 bug 的批量將 png 圖片轉換成 jpg 格式的腳本:

#!/bin/bash
# 批量將 PNG 圖片轉換成 JPG 格式
# script whith a bug
for image in *.png;
do
convert "$image" "${image%.png}.jpg"
echo "image $image converted to ${image%.png}.jpg"
# done
exit 0

保存文件,接着運行該腳本並執行語法檢查:

$ bash -n debug.sh

檢查 shell 腳本語法

從上面的輸出中,可以看到腳本中有一個錯誤,for 循環缺少了一個結束的 done關鍵字。shell 腳本從頭到尾檢查文件,一旦沒有找到它(done),shell 會打印出一個語法錯誤:

debug.sh: line 10: syntax error: unexpected end of file

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

$ bash -vn debug.sh

此外,可以用內置的 set 命令來在腳本中啟用調試模式。

下面的例子中,只檢查腳本中的 for 循環語法。

#!/bin/bash
#批量將 PNG 圖片轉換成 JPG 格式
#using set shell built-in command to enable debugging
#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

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

---------------------------------華麗分割線---------------------------------

直接運行debug.sh腳本:

 

 這里提示我沒有安裝convert,我也不知道哪個包里有convert命令,使用如下命令反追蹤含有convert的包名。

$ yum provides */convert

 出來一堆包,我就安裝這個包:ImageMagick-6.9.10.68-3.el7.x86_64

$ yum install ImageMagick-6.9.10.68-3.el7.x86_64

 然后直接執行debug.sh腳本

這個時候輸出是正常的了,因為我本來就沒有image這個文件夾。

在腳本啟動時添加調試選項,來調試debug.sh

$ bash -x  ./debug.sh

  • -x,提供跟蹤執行信息,將執行的每一條命令和結果依次打印出來。

同理我也可以使用set命令,只檢查腳本中的 for 循環語法輸出。

 #!/bin/bash
 # 批量將 PNG 圖片轉換成 JPG 格式
 # convert
 set -x
 for image in *.png;
 do
 convert "$image" "${image%.png}.jpg"
 echo "image $image converted to ${image%.png}.jpg"
 set +x
 done 
 exit 0

 

----------------------------------------華麗分割線---------------------------------------- 

除了bash內置的選項來調試shell,還可以自定義調試函數。自定義調試函數可以更加靈活的應用,這里我就不過多闡述。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM