脚本写一行echo也能写出bug ? glob了解一下
2020-03-13 23:13
141 查看
## 背景
最近处理一个 `bug` 很有意思,有客户反馈某个配置文件解析失败了,出错的那行的内容就只有一个字母 `a`。
最开始以为是谁改动了处理的脚本,但要到了问题代码中的脚本,比较发现跟库上是一样的。
又经过一番查找,才发现原来是脚本中的一行 `echo` 引入的。
## 问题代码
出问题的那行 `bash` 脚本是这样, `echo` 一个字符串到某配置文件中。
```bash
echo [partition] >> xxx.config
```
这行平平无奇的代码在大多数人的环境下,确实是正常运行的,但某些情况下会出 `bug`,那就是当运行脚本的目录下存在特定文件的时候。
## 复现问题
看看例子,就明白了,其实就是匹配到了文件名。
```bash
/$ mkdir /tmp/glob_test && cd /tmp/glob_test
/tmp/glob_test$ echo [partition]
[partition]
/tmp/glob_test$ touch a
/tmp/glob_test$ echo [partition]
a
/tmp/glob_test$ touch o
/tmp/glob_test$ echo [partition]
a o
```
也就是说出问题的机器上,运行脚本的环境刚好存在一个名为 `a` 的文件,于是这行脚本的行为就改变了。
本意是写入 `[partition]` 实际上写入了`a`
解决也很简单,加上引号。
```bash
echo "[partition]" >> xxx.config
```
## glob简介
解决了问题,再回头认识下这个特性。这个叫 `glob` ,是 `bash` 的一个特性,可以实现文件名的通配。
最原始可追溯到 `UNIX V6`,后来就变成了 `shell` 内建的特性。
当字符串包含了 `'?' '*' '['` 的时候就会触发匹配,自动展开成匹配到的文件列表,这个比正则表达式要弱一些,但胜在简单实用。
大家可能经常用到类似于 `ls *.c'` 之类的功能,这就是 `glob` 生效的地方。
这里不再详细列出语法,请参考 `man 7 glob` 或网上诸多文章,例如阮一峰老师就分享过:[命令行通配符教程](http://www.ruanyifeng.com/blog/2018/09/bash-wildcards.html)
有一个要注意的地方就是,这个匹配如果失败,就会原样输出,这也是上文的例子在多数情况下能工作的原因。
## 写在最后
写脚本时该加引号还是得加上的,养成良好的习惯可以少写 `bug`。
另外,虽然 `shellcheck` 并不能检测到这种情况,但对于提高脚本质量还是很有帮助的,之前也介绍过,可参考:[shellcheck 帮助你写出更好的脚本](https://sourl.cn/qyeV7h)
本文地址: [https://www.cnblogs.com/zqb-all/p/12489524.html](https://www.cnblogs.com/zqb-all/p/12489524.html)
公众号: [https://sourl.cn/nYkaiK](https://sourl.cn/nYkaiK)
相关文章推荐
- 对于写bash脚本的朋友,read命令是不可或缺的,需要实践一下就可以了解read命令的大致用途: 编写一个脚本: #!/bin/bash # hao32 test read echo -e "Pl
- 了解一下脚本语言
- 我所了解的微信引流脚本软件的操作方法和原理,分享一下。
- C语言_来了解一下GCC编译器编译C可执行脚本的过程
- Dubbo一致性哈希负载均衡的源码和Bug,了解一下?
- 程序员如何写出优质干净的代码?这6个技巧了解一下!
- tcl脚本了解一下
- 修正“苦练1天半,终于写出了一些常用doxygen风格的vim注释脚本”部分BUG
- Dubbo加权轮询负载均衡的源码和Bug,了解一下?
- Dubbo加权轮询负载均衡的源码和Bug,了解一下?
- Dubbo一致性哈希负载均衡的源码和Bug,了解一下?
- Java 重大升级马上来了:JDK 11 新特性了解一下
- 第三篇( 选择结构) :《据说是:“当今社会最有前途!最值得学习的语言!”》让我们来了解一下这是什么样的一种语言!
- 写出健壮的Bash脚本
- 一些经典的主要用户黑客的vbs脚本结合echo的dos下实现
- 了解一下木制楼梯的清洁养护和注意事项
- 测试一下你对指针的了解
- 小小了解一下NIO
- sed删除文件中的一行内容的脚本代码
- 关于一致性hash,这可能是全网最形象生动最容易理解的文档,想做架构师的你来了解一下