《學習bash》筆記--調試shell程式,《學習bash》shell
在shell中,最簡單的調試助手時輸出語句echo,可以通過把許多echo語句放到代碼中進行調試,但必須花費足夠的時間以定位
要查看的資訊。可能必須通過許多的輸出才能發現要尋找的資訊。
1.set選項最基本的時set -o命令選項,當運行指令碼時,這些選項可以用在命令列上,如下表所示:set -o選項 命令列選項 行為noexec -n 不運行命令,值檢查語法錯誤verbose -v 在運行命令前回送它們xtrace -x 回送進行替換處理後的命令
指令碼a.sh的內容為:set -n
if cd /dev; do
echo "in dev執行指令碼結果:$ ./a.sh
./a.sh: line 2: syntax error near unexpected token `do'
./a.sh: line 2: `if cd /dev; do'
d
指令碼a.sh的內容為:
set -v
echo "1"
echo "2"
執行指令碼結果:$ ./a.sh
echo "1"
1
echo "2"
2
指令碼a.sh的內容為:
set -x
echo "$PWD"執行指令碼結果:++ echo /home/yanwenjie/bashtest
/home/yanwenjie/bashtest
-x選項將回送經過參數替換、命令替換和其他命令列處理步驟後得到的命令列結果。x選項在每一行開始都列印+,(但是不知道為什麼我這邊列印了2個),這實際上可以定製的,它是內建變數shell變數PS4的值。可以通過修改PS4的值來修改這個符號。例如指令碼a.sh的內容如下:PS4="debug->"
set -x
echo "$PWD"
執行結果:$ ./a.sh
ddebug->echo /home/yanwenjie/bashtest
/home/yanwenjie/bashtest
(不知道為什麼這邊出現了2個d。。誰能回答一下)
讓我們簡單回顧一下PS1,PS2,PS3的作用:PS1是用來控制shell提示符的樣式。例如我登陸shell的式樣是:root@ywjPC:~# PS2是當我們輸入"\"時,多行提示符的樣式,預設是">".PS3是Shell指令碼中使用select時的提示符。
2.偽訊號偽訊號和工作方式和trap一樣,但它們時由shell本身產生,可以像對待shell指令碼裡的實際訊號一樣對待它。偽訊號 發送時間EXIT shell從指令碼中退出後DEBUG shell已經執行了一個語句
2.1.EXIT例如下面的指令碼a.sh:trap "echo 'exit from shell'" EXIT
echo "hello"
執行結果:# ./a.sh
hello
exit from shell
2.2.DEBUGDEBUG用來在一個函數或指令碼內所有語句後執行陷阱代碼。它的主要用途是用來作為一種跟蹤錯誤的程式狀態元素的強制性方法。例如下面的指令碼a.sh:function dbgtrap
{
echo "i=$i"
}
i=1
trap dbgtrap DEBUG
i=$((i+1))
i=$((i+1))
i=$((i+1))
trap - DEBUG
指令碼中兩個trap之間的每條語句執行後都會執行dbgtrap函數,包含第一個trap語句。執行結果:# ./a.sh
i=1
i=2
i=3
i=4
其中i=1是trap dbgtrap DEBUG語句執行後輸出的。
shell程式怎運行與調試?
1,可以 sh test.sh 來運行;
可以賦予這個檔案以可執行許可權後運行:
chmod u+x test.sh
./test.sh
調試,在必要的地方添加如 echo 的輸出語句來判斷即可。
怎調試shell指令碼?各種方法都說說
方法一:sh -x script.sh
-x選項會將運行到的指令碼內容顯示在螢幕上,前面有個+號。這樣就知道哪句被執行到了。對調試很有協助。
方法二:在指令碼中使用debug開關
適用於只調試部分指令碼的情況。
set -x
......(要調試的程式碼片段)
set +x
然後sh script.sh運行指令碼
方法三:在指令碼中添加列印
比如搞個log輸出函數,專門用於列印調試相關資訊。
_log()
{
if [ "$_DEBUG" = "true" ]; then
echo "調試資訊"
fi
}
只要在外面控制$_DEBUG開關即可。