bash陷阱

Posted on 2013-12-04 15:04  justff  阅读(234)  评论(0编辑  收藏  举报

节选自:http://bash.cumulonim.biz/BashPitfalls.html

原文有43个bash pitfall,这里挑了5个我认为比较重要的,和大家分享一下

同时建议大家都读一读原文


1. for i in $(ls *.mp3)
错误:
如果文件名包含空格,譬如:01 - Don't Eat the Yellow Snow.mp3,上述语句会将文件名分拆为7个部分:01,-,Don't,Eat,the,Yellow,Snow.mp3
ls是多余的
正确写法:
for i in *.mp3; do
[[ -f "$i" ]] || continue
some command "$i"
done

2. cd /foo; bar
错误:
考虑这样的语句:cd /NonexistentDir; rm -rf *
目录/NonexistentDir不存在,第一条语句执行失败,第二条语句删除当前目录下所有文件及文件夹
正确写法:
cd /foo && bar

3. echo $foo
错误:
msg="Please enter a file name of the form *.log"
echo $msg
正确写法:
echo "$msg" 当msg中包含-n之类的内容时也会出现问题
100%安全的写法是
printf "%s\n" "$foo"

4. echo "Hello World!"
错误:
默认环境的bash会解析!为历史命令符,且对!的转义无效
正确写法:
echo 'Hello World!'

set +H
echo "Hello World!"

histchars=

5. somecmd 2>&1 >logfile
错误:
仍然会打印错误信息
正确写法:
somecmd &> logfile
或somecmd > logfile 2>&1