记一次 Bash 脚本调优

  • A+
所属分类:系统文档

声明:一下文章为博主亲自实验记录,如有雷同,不胜荣幸。

Linux系统中,脚本是个举足轻重的家伙,甚至你不会写点脚本,都不能说你会Linux。这句话并不是夸张,因为脚本能帮助你做很多重复性的工作,同时也能按你的需求,给你需要的数据。所以说,脚本在Linux中是举足轻重的家伙。

由于博主不是科班出身,所以在计算机基础、编程等这方面有所欠缺,往往都是现炒现卖,不求甚解。但只要你去专研,熟练,多敲,久而久之,其实也能按自己的需求去写一些脚本。

这次调试的脚本是之前写好的一个用于 Zabbix 发送短信的 Bash 脚本,由于 Zabbix 告警是英文,需要对相关字段进行替换(可以理解为汉化。一开始博主是一段一段替换,当有新的字段出现,脚本中就需要继续增加代码,不是很方便。代码截取如下:

str01=$2                          # 用str01 接受来自 Zabbix 的告警 messges
str02=${str01/old_str/new_str}
....

假使我有100个字段需要替换,那么我的 Bash 脚本就需要增加100行代码 str01 ~ str100,是不是很疯狂?所以我就想了个办法。把我需要替换的字段按一定规则写入一个txt文本,然后每次执行脚本的时候去匹配txt文本里面的内容,然后进行逐一替换,这样做的好处就是,如果当中的字段需要变更,我只需要修改txt文本即可,文本规则如下:

 old_str1 new_str1
 old_str2 new_str2
 .....

左边是需要替换关键字,右边是替换后的关键字,这里呢涉及到读取文件操作,曾经我是比较倾向于 for 语句的,但是在这里遇到了一个问题,就是空格问题,for 语句默认是空格换行,所以不满足我的需求,当然了,在 for 循环之前是可以指定换行符的,但是这么做的话代码量又增加了.....

博主是一个比较懒的人,一行代码能解决的事情绝对不写两行,计算机能自动完成的,绝对不自己去做。所以呢我把目光转向了 while 循环,因为它是按行读取的,不管你有没有空格,代码截取如下:

while read line
do
   old_str=$(echo $line | cut -d' ' -f1) # 需要查找的关键字段
   new_str=$(echo $line | cut -d' ' -f2) # 替换成的字段
   strs=${str01/old_str/new_str}         # Bash 变量值字符串替换格式
   str01=strs                            # 注意,这里需要重新赋值下,否则替换无效
done < ./list.txt

正如上 while 循环代码,就可以简化代码,同时后期维护、修改也非常方便。

这次也遇到一个我从来没遇到的问题(博主比较菜),江湖有云“但凡英雄者,皆是填坑老手”,话糙理不糙,所有的大神都是从填坑走过来的,没有经验谈个锤子,对吧?!

我遇到的问题是:
Bash 脚本调试没问题,bash -x 153xxx 'This is a test messges !' sendsms.sh

运行结果满足我的需求,没有出任何问题,但是当我把这个新改的脚本交个 Zabbix 调用的时候,发现变量值为空了,那么可想而知结果肯定不是我预期的,这个问题又困扰了我,开始自检 Bash 代码语法、逻辑关系等皆找不出问题,几经折腾,才想起是权限问题,因为我在调试脚本的时候是 root 权限调试的,自然而然没有什么权限的限制,但是交给 Zabbix 调用的时候,用户就变成了 zabbix 用户,这里提下 zabbix 用户没权限在自己目录下读写文件,特别是调用脚本的时候(所以,如果你的文件需要脚本运行的时候读写操作,最好的方法就是放在公共目录,比如 /var 下)

至此,基本上整个脚本调优结束,博主这里再唠叨两句,我在这个脚本中还有两个功能需求需要实现:
1、随机数问题;
2、随机读取文件中一行内容;

随机数问题可以用 awk 命令来完成,但是随机按行读取文件内容就有点意思了,在强大互联网上,我查到有个命令叫shuf,这个命令比较有意思,它既可以随机读取文件中的行,也可以生成指定随机数,但是需要注意的,它生成的随机数是按列来打印的,如果需要按行的话需要自行替换换行符,比如用 tr 命令即可完成操作:

 shuf -n1 < filename    # 随机读取某个文件中的一行内容
 shuf -i 1-9 -n2        # 随机生成1-9 整数,并随机读取其中的2个

我觉得这个命令挺好玩的,语法比 awk 简单得多,同时也能解决随机数的问题!

综上述,不足之处欢迎指出,共同进步。

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: