预览加载中,请您耐心等待几秒...
1/9
2/9
3/9
4/9
5/9
6/9
7/9
8/9
9/9

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

QUOTE: foriin`ls*.mp3` 常见的错误写法: foriin`ls*.mp3`;do????#Wrong! 为什么错误呢?因为for...in语句是按照空白来分词的,包含空格的文件名会被拆成多个词。如遇到01-Don'tEattheYellowSnow.mp3时,i的值会依次取01,-,Don't,等等。 用双引号也不行,它会将ls*.mp3的全部结果当成一个词来处理。 foriin"`ls*.mp3`";do??#Wrong! 正确的写法是 foriin*.mp3;do cp$file$target 这句话基本上正确,但同样有空格分词的问题。所以应当用双引号: cp"$file""$target" 但是如果凑巧文件名以-开头,这个文件名会被cp当作命令行选项来处理,依旧很头疼。可以试试下面这个。 cp--"$file""$target" 运气差点的再碰上一个不支持--选项的系统,那只能用下面的方法了:使每个变量都以目录开头。 foriin./*.mp3;do??cp"$i"/target??... [$foo="bar"] 当$foo为空时,上面的命令就变成了 [="bar"] 类似地,当$foo包含空格时: [multiplewordshere="bar"] 两者都会出错。所以应当用双引号将变量括起来: ["$foo"=bar]????#几乎完美了。 但是!当$foo以-开头时依然会有问题。在较新的bash中你可以用下面的方法来代替,[[关键字能正确处理空白、空格、带横线等问题。 [[$foo=bar]]????#正确 旧版本bash中可以用这个技巧(虽然不好理解): [x"$foo"=xbar]??#正确 或者干脆把变量放在右边,因为[命令的等号右边即使是空白或是横线开头,依然能正常工作。(Java编程风格中也有类似的做法,虽然目的不一样。) [bar="$foo"]????#正确 cd`dirname"$f"` 同样也存在空格问题。那么加上引号吧。 cd"`dirname"$f"`" 问题来了,是不是写错了?由于双引号的嵌套,你会认为`dirname是第一个字符串,`是第二个字符串。错了,那是C语言。在bash中,命令替换(反引号``中的内容)里面的双引号会被正确地匹配到一起,不用特意去转义。 $()语法也相同,如下面的写法是正确的。 cd"$(dirname"$f")" ["$foo"=bar&&"$bar"=foo] [中不能使用&&符号!因为[的实质是test命令,&&会把这一行分成两个命令的。应该用以下的写法。 [bar="$foo"-afoo="$bar"]????#Right![bar="$foo"]&&[foo="$bar"]??#Alsoright![[$foo=bar&&$bar=foo]]??????#Alsoright! [[$foo>7]] 很可惜[[只适用于字符串,不能做数字比较。数字比较应当这样写: (($foo>7)) 或者用经典的写法: [$foo-gt7] 但上述使用-gt的写法有个问题,那就是当$foo不是数字时就会出错。你必须做好类型检验。 这样写也行。 [[$foo-gt7]] grepfoobar|whilereadline;do((count++));done 由于格式问题,标题中我多加了一个空格。实际的代码应该是这样的: grepfoobar|whilereadline;do((count++));done??????#错误! 这行代码数出bar文件中包含foo的行数,虽然很麻烦(等同于grep-cfoobar或者grepfoobar|wc-l)。乍一看没有问题,但执行之后count变量却没有值。因为管道中的每个命令都放到一个新的子shell中执行,所以子shell中定义的count变量无法传递出来。 if[grepfoomyfile] 初学者常犯的错误,就是将if语句后面的[当作if语法的一部分。实际上它是一个命令,相当于test命令,而不是if语法。这一点C程序员特别应当注意。 if会将if到then之间的所有命令的返回值当作判断条件。因此上面的语句应当写成 ifgrepfoomyfile>/dev/null;then if[bar="$foo"] 同样,[是个命令,不是if语句的一部分,所以要注意空格。 if[bar="$foo"] if[[a=b]&&[c=d]] 同样的问题,[不是if语句的一部分,当然也不是改变逻辑判断的括号。它是一个命令。可能C程序员比较容易犯这个错误? if[a=b]&&[c=d]??????#正确 catfile|seds/foo/bar/>file 你不能在同一条管道操作中同时读写一个文件。根据管道的实现方式,file要