shell中相同字符串比较结果为不同的定位思路与解决办法

shell中相同字符串比较结果为不同的定位思路与解决办法

概要
在Linux工具使用过程中,很多的情况下我们需要对工具执行的结果进行提取,然后用于对比校验。为了减少人为识别带来的不确定性,同时为了提高流程效率,校验工作常常选择使用shell脚本来完成。
关于整数及字符型数字的比较,在这里不多赘述,常用方法可以参考
https://www.runoob.com/linux/linux-shell-basic-operators.html
抓取结果中的字符串时,当我们不是将结果输出至txt、log等文件中再重新读取,而是用采用grep&awk命令直接抓取结果,可能会碰到两组显示完全相同的字符串,比较的结果却不一致。

背景
在使用Linux工具查询固件版本号后的到结果如下:
查询结果

版本号校验需要抓取图中青色字符,与保存有版本号的ini文件内容进行比对校验。首先使用
grep 3b | awk '{print $5$6$7$8$9$10}'
拦截所需要的版本号信息。
然后读取校验标准,并进行判断。
拦截结果

结果显示两字符串并不相同。

定位思路
在我个人使用上述校验步骤的过程中,遇到如下问题:
1) 类型是否相同

使用双引号或单引号进行字符拼接。
例如:echo “str_${var}”;用字符拼接的方式将变量强制转换为字符串格式,保证用来比较的数据类型一致。
2) 首尾是否存在空格
如果某个变量在拦截时尾部存在有空格字符,也会造成变量不相等的比较结果。我们可以使用字符拼接的方法在变量的首尾各自加上一固定字符然后输出,观察是否有空格存在。
若存在空格,可使用
sed 's/ //g’
将空格替换为空白字符,以达到去除空格的目的。
3) 是否存在不显示的控制字符
字符串长度

使用wc –L分别获取两个字符串的长度,可知白色字符串的长度为12,青色字符串的长度为18。怀疑存在“看不见”的字符。
将两个变量输出至txt文件可得到如下结果:
实际字符串内容

青色字符串的txt文件中多出了一部分“\033[1;3m”(即ESC[1;36m),这部分为控制shell输出颜色、格式的控制字符。关于改变输出内容的颜色、格式等相关知识可以参考
https://www.cnblogs.com/wozijisun/p/4708091.html
在比较的过程中可以使用
sed -r "s/\x1B[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
将这些控制字符删除,得到默认格式的字符串,以便我们进行判断校验。

最后有一个小建议,使用特殊颜色或格式进行出输出后,记得在变量或字符串后面添加恢复默认的控制字符,避免命令行“花里胡哨”。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值