shell 腳本調試
參數 -x 跟蹤腳本
- shell 腳本調試參數 -x
- #BASH
- [root@74 ~]# bash -x /usr/local/keepalived/haproxy_check.sh
- eth1_ip=10.0.100.74
- eth0_ip=192.168.57.74
- eth1_url=http://10.0.100.74:80
- eth0_url=http://192.168.57.74:80
- ps -C keepalived --no-header
- wc -l
- keepalived=0
- true
- failed=0
- curl -IL http://192.168.57.74:80
- true
- date ' %F_%T'
- date=' 2011-12-16_11:57:51'
- curl -IL http://192.168.57.74:80
- curl -IL http://10.0.100.74:80
- check=0
- sleep 1
- '[' 0 -eq 2 ']'
- #同樣SH 也有-x 調試功能,在腳本尾部添加“abc”,然後使用-x 調試該腳本,將返回錯誤信息
- [root@74 ~]# sh -x /usr/local/keepalived/haproxy_check.sh
- eth1_ip=10.0.100.74
- eth0_ip=192.168.57.74
- eth1_url=http://10.0.100.74:80
- eth0_url=http://192.168.57.74:80
- ps -C keepalived --no-header
- wc -l
- keepalived=0
- true
- failed=0
- curl -IL http://192.168.57.74:80
- true
- date ' %F_%T'
- date=' 2011-12-16_11:56:37'
- curl -IL http://192.168.57.74:80
- curl -IL http://10.0.100.74:80
- check=0
- sleep 1
- '[' 0 -eq 2 ']'
- break 2
- break 2
- abc
- /usr/local/keepalived/haproxy_check.sh: line 40: abc: command not found
使用PS4,更詳細的輸出
- [root@74 ~]# export PS4=' {$LINENO:${FUNCNAME[0]}} '
- [root@74 ~]# sh -x /usr/local/keepalived/haproxy_check.sh
- {6:} eth1_ip=10.0.100.74
- {7:} eth0_ip=192.168.57.74
- {8:} eth1_url=http://10.0.100.74:80
- {9:} eth0_url=http://192.168.57.74:80
- {10:} wc -l
- {10:} ps -C keepalived --no-header
- {10:} keepalived=0
- {12:} true
- {13:} failed=0
- {15:} curl -IL http://192.168.57.74:80
- {18:} true
- {19:} date ' %F_%T'
- {19:} date=' 2011-12-16_12:54:13'
- {21:} curl -IL http://192.168.57.74:80
- {21:} curl -IL http://10.0.100.74:80
- {22:} check=0
- {23:} sleep 1
- {26:} '[' 0 -eq 2 ']'
- {29:} break 2
參數 -n 檢查語法是否錯誤,但不會實際執行命令!
去掉腳本 if 後邊的 then 試試
- sh -n /usr/local/keepalived/haproxy_check.sh
- /usr/local/keepalived/haproxy_check.sh: line 28: syntax error near unexpected token `else'
- /usr/local/keepalived/haproxy_check.sh: line 28: ` else'
其它參數摘自IBM
- 使用shell的執行選項,本節將介紹一些常用選項的用法:
- -n 只讀取shell腳本,但不實際執行
- -x 進入跟蹤方式,顯示所執行的每一條命令
- -c "string" 從strings中讀取命令
- “-n”可用於測試shell腳本是否存在語法錯誤,但不會實際執行命令.
- 在shell腳本編寫完成之後,實際執行之前,首先使用“-n”選項來測試腳本是否存在語法錯誤是一個很好的習慣.
- 某些shell腳本在執行時會對系統環境產生影響,比如生成或移動文件等,如果在實際執行才發現語法錯誤,
- 您不得不手工做一些系統環境的恢復工作才能繼續測試這個腳本.
- “-c”選項使shell解釋器從一個字元串中而不是從一個文件中讀取並執行shell命令.
- 當需要臨時測試一小段腳本的執行結果時,可以使用這個選項,如下所示:
- sh -c 'a=1;b=2;let c=$a $b;echo "c=$c"'
- "-x"選項可用來跟蹤腳本的執行,是調試shell腳本的強有力工具.
- “-x”選項使shell在執行腳本的過程中把它實際執行的每一個命令行顯示出來,並且在行首顯示一個" "號.
- " "號後面顯示的是經過了變數替換之後的命令行的內容,有助於分析實際執行的是什麼命令.
- “-x”選項使用起來簡單方便,可以輕鬆對付大多數的shell調試任務,應把其當作首選的調試手段.
總結摘自IBM
- 調試shell腳本的過程:
- 首先使用“-n”選項檢查語法錯誤,然後使用“-x”選項跟蹤腳本的執行,使用“-x”選項之前,
- 別忘了先定製PS4變數的值來增強“-x”選項的輸出信息,至少應該令其輸出行號信息
- (先執行export PS4=' [$LINENO]',更一勞永逸的辦法是將這條語句加到您用戶主目錄的.bash_profile文件中去),這將使你的調試之旅更輕鬆.
- 也可以利用trap,調試鉤子等手段輸出關鍵調試信息,快速縮小排查錯誤的範圍,並在腳本中使用“set -x”及“set x”對某些代碼塊進行重點跟蹤.
- 這樣多種手段齊下,相信您已經可以比較輕鬆地抓出您的shell腳本中的臭蟲了.
結束
[火星人 ] shell 腳本調試已經有269次圍觀