Bash Pitfalls 文章介绍了40多条日常 Bash 编程中,老手和新手都容易忽略的错误编程习惯。每条作者在给出错误的范例上,详细分析与解释错误的原因,同时给出正确的改写建议。文中有不少引用的文章,也值得大家仔细阅读。仔细阅读了这篇文章后,收获很多,不感独享,把这篇文章以半翻译半笔记的形式分享给大家。
本篇翻译一共分成四篇文章,以下是索引:
1. for i in $(ls *.mp3)
Bash写循环代码的时候,确实比较容易犯下面的错误:
for i in $(ls *.mp3); do # 错误! some command $i # 错误! done for i in $(ls) # 错误! for i in `ls` # 错误! for i in $(find . -type f) # 错误! for i in `find . -type f` # 错误! files=($(find . -type f)) # 错误! for i in ${files[@]} # 错误!
这里主要两个问题:
- 使用命令展开时不带引号,其执行结果会使用IFS作为分隔符,拆分成参数传递给for循环处理;
- 不应该让脚本去解析ls命令的结果;
我们不能避免某些文件名中包含空格,Shell会对$(ls *.mp3)
展开的结果会被做单词拆分(WordSplitting)的处理。假设有一个文件,名字为01 - Don't Eat the Yellow Snow.mp3,for循环处理的时候,会今次遍历文件名中的每个单词:01, -, Don't, Eat等等:
继续阅读