声明:一下文章为博主亲自实验记录,如有雷同,不胜荣幸。
在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
简单得多,同时也能解决随机数的问题!
综上述,不足之处欢迎指出,共同进步。