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
打印变量。