Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1754258
  • 博文数量: 787
  • 博客积分: 10000
  • 博客等级: 上将
  • 技术积分: 5015
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-22 15:17
文章分类

全部博文(787)

文章存档

2008年(787)

我的朋友

分类:

2008-09-25 16:09:11

我来说一句,书中的这个例子是没有什么错误的,仅仅是不够严谨而已。

#!/bin/sh
for name in `ls`
do
        if [ -f $name ]; then
                echo "$name is a regular file"
        elif [ -d $name ]; then
                echo "$name is a directory"
        fi
done

====================================================
多数Linux发行版的ls命令并不是原始的ls命令,而是命令别名,我们可以运行 alias ls 就可以看到它实际上是原始的ls命令并已加上一个参数,不同的发行版和不同的使用者都可能有不同的习惯,也许在作者的机器上,他的 ls 也许是一行显示一个文件/文件夹的名称(比如他的alias ls=ls -1等等),所以在其机器上运行无误,但到了其他人的机器上,ls可能是一行显示多个文件/文件平的名称,此时就会出错了。

所以作者应该把`ls`写成`ls -1`,这样就严谨一些,在各个机器上均可正确运行;当然写成*的结果也一样。      
--------------------next---------------------
我的总结:

1.
错误代码:
find | while read name
do
    echo "$name"
done
严格的讲, find | read 模式也是有问题的, read 会对反斜杠 \ 有特殊处理
find | sed -e 's/\\/\\\\/g' | while read name
do
    echo "$name"
done
这样的代码才不会一遇到输入字符串的空格就进入do...done且处理了read的特殊情况
2.
错误代码:
echo $name
正确代码:
echo "$name"
echo "$name" 跟 echo $name 还是有区别的. 比如 name 中有两个连续空格的时候 
3.
for name in *
do
    echo $name
done
这样的代码不会一遇到输入字符串的空格就进入do...done
4.
for name in `ls`
do
    echo $name
done
这样的代码会一遇到输入字符串的空格就进入do...done
5.
dir=`pwd`
echo $dir
即使`pwd`输出中有空格,dir也会归入其中,成为一个完整的字符串
6.
错误代码:
if [ -e $test ] ; then
    echo "hoho"
fi
正确代码:
if [ -e "$test" ] ; then
    echo "hoho"
fi
7.
错误代码:
file $name
cat $name
rm $test
basename $dir
cp "have a test" $installdir
正确代码:
file "$name"
cat "$name"
rm "$test"
basename "dir"
cp "have a test" "$installdir"
8.
正确代码:
output="have a test"
echo "just" > $output

另送一个bash编程常见错误的总结网址:


结论:
没有特殊应用的话
for name in `ls`是错误的(for name in 'ls'也是错)
可以写成
for name in *
do
    ....
done

ls | sed -e 's/\\/\\\\/g' | while read name
do
    ....
done

[ 本帖最后由 c-aries 于 2008-9-10 12:01 编辑 ]      
--------------------next---------------------

阅读(455) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~