文章目录
- -x选项
- -n选项
- -v 选项
- set -x
对Linux脚本进行debug日志输出,在开发脚本的时候是非常有用的,这里我介绍四种进行debug的办法。
-x选项
学习linux,debug脚本可以说是必备技能。在练习之前,我们先准备一个脚本,下面是我写的一个简单脚本:
ubuntu@VM-0-17-ubuntu:~$ tee demo.sh
a=1
a=1
b=2
b=2
c=s
c=s
expr a + b + c
expr a + b + c
echo $c
echo $c
^C
最后的^C不是文件内容,是我按Ctrl+C退出时控制台的输出,而上面的重复,也是我每输入一行,控制台就反显一行,并不是输入了两行同样的内容。为此,可以检查下脚本内容:
ubuntu@VM-0-17-ubuntu:~$ cat demo.sh
a=1
b=2
c=s
expr a + b + c
echo $c
Debug脚本,不过是一个简单的-x选项,可以看到脚本运行时的每一行而已。现在我给脚本加上权限执行:
ubuntu@VM-0-17-ubuntu:~$ chmod +x demo.sh
ubuntu@VM-0-17-ubuntu:~$ bash -x demo.sh
+ a=1
+ b=2
+ c=s
+ expr a + b + c
expr: non-integer argument
+ echo s
s
ubuntu@VM-0-17-ubuntu:~$ ./demo.sh
expr: non-integer argument
s
区别在于,debug输出更加详细,更容易定位错误所在行。
-n选项
-n选项不会执行shell脚本,但是会检查shell脚本的错误。以下列脚本为例子:
[root@VM-0-8-centos test]# cat demo.sh
a=1
b=2
echo $(date)
echo `expr a+b
我直接执行就报这个错:
[root@VM-0-8-centos test]# bash demo.sh
2022年 12月 07日 星期三 23:12:52 CST
demo.sh:行4: 寻找匹配的 ``' 是遇到了未预期的文件结束符
demo.sh:行5: 语法错误: 未预期的文件结尾
有没有一种方法,像其他编译型编程语言一样,只检查语法错误,但是不执行代码?有的,这就是-n选项,效果如下:
[root@VM-0-8-centos test]# bash -n demo.sh
demo.sh:行4: 寻找匹配的 ``' 是遇到了未预期的文件结束符
demo.sh:行5: 语法错误: 未预期的文件结尾
可以看到,没有输出日期语句,说明脚本没执行,但是确实检查到了语法错误,`expr a+b后面没加`号。
-v 选项
-v选项和-x选项差不多,都是先打印语句再执行命令,不过显示命令的格式不一样。-v选项比较干净,-x选项会在前面加上很多+号,显示得更加复杂,我用下列脚本做个对比:
[root@VM-0-8-centos test]# cat test.sh
echo "Hello"
a=$(echo 17*17 |bc)
echo $a
执行后,两个选项的表现分别如下:
[root@VM-0-8-centos test]# bash -x test.sh
+ echo Hello
Hello
++ echo '17*17'
++ bc
+ a=289
+ echo 289
289
[root@VM-0-8-centos test]# bash -v test.sh
echo "Hello"
Hello
a=$(echo 17*17 |bc)
echo $a
289
set -x
除了bash的-x选项外,直接使用使用set -x也能debug,但是效果并不好,下面是个例子:
ubuntu@VM-0-17-ubuntu:~$ set -x
+ set -x
++ history -a
ubuntu@VM-0-17-ubuntu:~$ ./demo.sh
+ ./demo.sh
expr: non-integer argument
s
++ history -a
ubuntu@VM-0-17-ubuntu:~$ set +x
+ set +x
ubuntu@VM-0-17-ubuntu:~$ ./demo.sh
expr: non-integer argument
s
但是在脚本里使用的话效果就不一样了,以下是我修改后的脚本:
set -x
a=1
b=2
c=s
expr a + b + c
echo $c
set +x
我在脚本开头set -x开启debug,在脚本尾部加上set +x关闭debug,执行效果如下:
ubuntu@VM-0-17-ubuntu:~$ ./demo.sh
++ a=1
++ b=2
++ c=s
++ expr a + b + c
expr: non-integer argument
++ echo s
s
++ set +x