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,還可以自定義調試函數。自定義調試函數可以更加靈活的應用,這里我就不過多闡述。
