SHELL常见24个错误

SHELL常见24个错误

ID:37828045

大小:144.80 KB

页数:7页

时间:2019-06-01

SHELL常见24个错误_第1页
SHELL常见24个错误_第2页
SHELL常见24个错误_第3页
SHELL常见24个错误_第4页
SHELL常见24个错误_第5页
资源描述:

《SHELL常见24个错误》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、今天想分析的是这篇BashPitfalls,介绍了一些bash编程中的经典错误。fcicq说可能不适合初学者,而我认为,正是bash编程的初学者才应该好好阅读一下这篇文章。下面就逐个分析一下这篇文章中提到的错误。不是完全的翻译,有些没用的话就略过了,有些地方则加了些注释。1.foriin`ls*.mp3`常见的错误写法:foriin`ls*.mp3`;do#Wrong!为什么错误呢?因为for...in语句是按照空白来分词的,包含空格的文件名会被拆成多个词。如遇到01-Don'tEattheYellowSnow.mp3时,i的值会

2、依次取01,-,Don't,等等。用双引号也不行,它会将ls*.mp3的全部结果当成一个词来处理。foriin"`ls*.mp3`";do#Wrong!正确的写法是foriin*.mp3;do2.cp$file$target这句话基本上正确,但同样有空格分词的问题。所以应当用双引号:cp"$file""$target"但是如果凑巧文件名以-开头,这个文件名会被cp当作命令行选项来处理,依旧很头疼。可以试试下面这个。cp--"$file""$target"运气差点的再碰上一个不支持--选项的系统,那只能用下面的方法了:使每个变量都以目

3、录开头。foriin./*.mp3;docp"$i"/target...3.[$foo="bar"]当$foo为空时,上面的命令就变成了[="bar"]类似地,当$foo包含空格时:[multiplewordshere="bar"]两者都会出错。所以应当用双引号将变量括起来:["$foo"=bar]#几乎完美了。但是!当$foo以-开头时依然会有问题。在较新的bash中你可以用下面的方法来代替,[[关键字能正确处理空白、空格、带横线等问题。[[$foo=bar]]#正确旧版本bash中可以用这个技巧(虽然不好理解):[x"$foo

4、"=xbar]#正确或者干脆把变量放在右边,因为[命令的等号右边即使是空白或是横线开头,依然能正常工作。(Java编程风格中也有类似的做法,虽然目的不一样。)[bar="$foo"]#正确4.cd`dirname"$f"`同样也存在空格问题。那么加上引号吧。cd"`dirname"$f"`"问题来了,是不是写错了?由于双引号的嵌套,你会认为`dirname是第一个字符串,`是第二个字符串。错了,那是C语言。在bash中,命令替换(反引号``中的内容)里面的双引号会被正确地匹配到一起,不用特意去转义。$()语法也相同,如下面的写法是

5、正确的。cd"$(dirname"$f")"5.["$foo"=bar&&"$bar"=foo][中不能使用&&符号!因为[的实质是test命令,&&会把这一行分成两个命令的。应该用以下的写法。[bar="$foo"-afoo="$bar"]#Right![bar="$foo"]&&[foo="$bar"]#Alsoright![[$foo=bar&&$bar=foo]]#Alsoright!6.[[$foo>7]]很可惜[[只适用于字符串,不能做数字比较。数字比较应当这样写:(($foo>7))或者用经典的写法:[$foo-gt

6、7]但上述使用-gt的写法有个问题,那就是当$foo不是数字时就会出错。你必须做好类型检验。这样写也行。[[$foo-gt7]]7.grepfoobar

7、whilereadline;do((count++));done由于格式问题,标题中我多加了一个空格。实际的代码应该是这样的:grepfoobar

8、whilereadline;do((count++));done#错误!这行代码数出bar文件中包含foo的行数,虽然很麻烦(等同于grep-cfoobar或者grepfoobar

9、wc-l)。乍一看没有问题,但执行之后count变量

10、却没有值。因为管道中的每个命令都放到一个新的子shell中执行,所以子shell中定义的count变量无法传递出来。8.if[grepfoomyfile]初学者常犯的错误,就是将if语句后面的[当作if语法的一部分。实际上它是一个命令,相当于test命令,而不是if语法。这一点C程序员特别应当注意。if会将if到then之间的所有命令的返回值当作判断条件。因此上面的语句应当写成ifgrepfoomyfile>/dev/null;then9.if[bar="$foo"]同样,[是个命令,不是if语句的一部分,所以要注意空格。if[ba

11、r="$foo"]10.if[[a=b]&&[c=d]]同样的问题,[不是if语句的一部分,当然也不是改变逻辑判断的括号。它是一个命令。可能C程序员比较容易犯这个错误?if[a=b]&&[c=d]#正确11.catfile

12、seds/foo/bar/

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。