【Linux简单实用小命令030】你知道怎么调试shell脚本吗?

Scroll Down

bash -x

在使用Linux的时候,我们经常会遇到执行shell脚本的操作。

但是有时候,执行了shell,不知道它为什么报错?怎么去debug这个shell脚本呢?

Linux中有个关于shell执行的参数,即 -x,命令如下:

bash -x xxx.sh

sh -x xxx.sh

实例

具体怎么看呢?首先我们来一个有点问题的例子,命令实例如下:

[root@izbp117mtgmllet9ryobawz ~]# cat testMonitor.sh 
#!/bin/bash
# fileName:sysMonitor.sh
# title:系统监控
# desc:获取内核及系统版本、主机名及ip,监控内存、交换空间swap、磁盘、cpu及主机负载等信息
# author:yaomaomao
# date:2020-11-16
# quote: 本shell命令部分来源于互联网

#---------------------------------节选部分-有问题哦----------
# 内存总量(M)
mem_total=$(free -m | awk '/Mem/ {print $2}')
# 内存可用量(M)
mem_free=$(free -m | awk '/Mem/ {print $7}')
# 交换分区总量(M)
swap_total=$(free -m | awk '/Swap/ {print $2}')
# 交换分区剩余量(M)
swap_free=$(free -m | awk '/Swap/ {print $7}')

echo -e "内存利用率 $mem_free/$swap_total"
echo -e "交换分区利用率 $swap_free/$swap_total"

执行结果:

[root@izbp117mtgmllet9ryobawz ~]# sh testMonitor.sh 
内存利用率 14169/32013
交换分区利用率 /0

可以看到,交换分区剩余量是空的,奇怪,为什么是空的呢?

我们用sh -x命令来看下:

[root@izbp117mtgmllet9ryobawz ~]# sh -x testMonitor.sh 
++ free -m
++ awk '/Mem/ {print $2}'
+ mem_total=32013
++ free -m
++ awk '/Mem/ {print $7}'
+ mem_free=14190
++ free -m
++ awk '/Swap/ {print $2}'
+ swap_total=0
++ free -m
++ awk '/Swap/ {print $7}'
+ swap_free=
+ echo -e '内存利用率 14190/32013'
内存利用率 14190/32013
+ echo -e '交换分区利用率 /0'
交换分区利用率 /0

可以看到,在获取swap_free前,我们先执行了一次free -m,又执行了一次awk '/Swap/ {print $7}',结果获取到的swap_free却是空的。

怎么继续排查呢?

我们将命令单独拿出来执行一波:

[root@izbp117mtgmllet9ryobawz ~]# free -m | awk '/Swap/ {print $7}'

确实是空的

那再将free -m执行下:

[root@izbp117mtgmllet9ryobawz ~]# free -m
            total        used        free      shared  buff/cache   available
Mem:          32013       17133         710         215       14169       14216
Swap:             0           0           0

可以看到,Swap行的free是有值的,只不过是0。那是哪里出了问题?

我们再回看awk命令

awk '/Swap/ {print $7}'

原来我们写的是获取Swap行的第7列,是复制的获取内存剩余量的写法,怪不得写错了。

我们将其换成获取第4列,命令如下:

[root@izbp117mtgmllet9ryobawz ~]# free -m | awk '/Swap/ {print $4}'
0

修改脚本:

……
swap_free=$(free -m | awk '/Swap/ {print $4}')
……

再次执行:

[root@izbp117mtgmllet9ryobawz ~]# sh testMonitor.sh 
内存利用率 14208/32013
交换分区利用率 0/0

小结

调试技巧只是辅助,最重要的还是思路。

梳理下调试步骤或者小技巧:

1、使用bash -x xxx.sh来执行脚本;

2、单独将某行命令拿出来执行;

3、使用echo打印变量。