在shell脚本中,通过set -x命令进入调试模式,之后Shell除了输出shell执行的结果外,还会输出每行执行的shell命令。
1 #!/bin/bash
2
3 set -x
4
5 a=1
6 while [[ $a -le 5 ]];
7 do
8 echo $a
9 let "a+=1"
10 done
下面的输出中带加号表示该条语句是Shell执行的命令,不带加号表示该语句是Shell产生的输出。
# bash t.sh
+ a=1
+ [[ 1 -le 5 ]]
+ echo 1
1
+ let a+=1
+ [[ 2 -le 5 ]]
+ echo 2
2
+ let a+=1
+ [[ 3 -le 5 ]]
+ echo 3
3
+ let a+=1
+ [[ 4 -le 5 ]]
+ echo 4
4
+ let a+=1
+ [[ 5 -le 5 ]]
+ echo 5
5
+ let a+=1
+ [[ 6 -le 5 ]]
如果需要中断调试,在调试过程中可以按Ctrl + Z中断调试,观察结果,然后再按fg键继续调试即可。
在shell脚本的开头加上set -x后,会调试整个脚本,有时候可能不需要对整个脚本进行调试,只需要调试某个代码块,那么可以用set -x和set +x把需要调试的代码块包围起来即可,如下
1 #!/bin/bash
2
3 set -x
4
5 a=1
6
7 function show(){
8 echo '$a is now =' $1
9 }
10
11 while [[ $a -le 5 ]];
12 do
13 show $a
14 let "a+=1"
15 done
这里set -x加在shell脚本的开头,调试的是整个脚本
# bash t.sh
+ a=1
+ [[ 1 -le 5 ]]
+ show 1
+ echo '$a is now =' 1
$a is now = 1
+ let a+=1
+ [[ 2 -le 5 ]]
+ show 2
+ echo '$a is now =' 2
$a is now = 2
+ let a+=1
+ [[ 3 -le 5 ]]
+ show 3
+ echo '$a is now =' 3
$a is now = 3
+ let a+=1
+ [[ 4 -le 5 ]]
+ show 4
+ echo '$a is now =' 4
$a is now = 4
+ let a+=1
+ [[ 5 -le 5 ]]
+ show 5
+ echo '$a is now =' 5
$a is now = 5
+ let a+=1
+ [[ 6 -le 5 ]]
下面的代码只调试show函数的调用
1 #!/bin/bash
2
3 a=1
4
5 function show(){
6 echo '$a is now =' $1
7 }
8
9 while [[ $a -le 5 ]];
10 do
11 set -x
12 show $a
13 set +x
14 let "a+=1"
15 done
输出如下
# bash t.sh
+ show 1
+ echo '$a is now =' 1
$a is now = 1
+ set +x
+ show 2
+ echo '$a is now =' 2
$a is now = 2
+ set +x
+ show 3
+ echo '$a is now =' 3
$a is now = 3
+ set +x
+ show 4
+ echo '$a is now =' 4
$a is now = 4
+ set +x
+ show 5
+ echo '$a is now =' 5
$a is now = 5
+ set +x
还记得上面说到的,输出的信息前面有一个+,表示这是shell执行的命令,如果有两个+呢?
1 #!/bin/bash
2
3 set -x
4 a=1
5 echo '$a='$a
6 echo `ls`
输出如下,看下面的++ ls
# bash t2.sh
+ a=1
+ echo '$a=1'
$a=1
++ ls
+ echo t2.sh t.sh
t2.sh t.sh
输出信息中的++ ls表示这个是在当前shell中启动的子shell中执行的命令。