for name in ‘ls’ 错了吗?

for name in ‘ls’ 错了吗?

源代码:
#!/bin/sh
for name in ‘ls’  #改成for name in *才能正常运行
do
        if [ -f $name ]; then
                echo '$name is a regular file'
        elif [ -d $name ]; then
                echo '$name is a directory'
        fi
done

问:
for name in ‘ls’ 是书上的方法,for name in *是在网上找来的方法
请问for name in ‘ls’ 这句错了吗?这是<<linux应用开发技术详解>>第69页的一个例子
作者本意是想举例说明“in列表可以是shell命令的输出”

思考:
我发现echo $name的结果是ls,这不是说明ls是字符串吗?哪里是“in列表可以是shell命令的输出”
所说的命令

注:
...新手自学,可能问题很低级,如果真的问得很傻请见谅。讨论一下,想知道真相
要学好linux必须学写程序,这应该是最好的linux入门方法,我是这样想的,呵呵,努力中,我再去查查资料,看看书      
for name in ‘ls’  
for name in `ls`

不是单引号,是大键盘1旁边的那个键      
建议在bash中使用 $(cmd) 代替很不容易看清楚的 `cmd`      
<<linux应用开发技术详解>>这本书讲得有点简陋      
谢谢两位的帮忙!
先粗浅入门再买过另外一本书来学      
現在不用 ` `, 用 $(....) , 這是 POSIX shell標準寫法
,內嵌命令比較好讀, 如
y=$(( $(wc -l < bin/pass.awk) - $( wc -l < bin/pass)  ))

y=$((`wc -l < bin/pass.awk` - `wc -l < bin/pass` ))
好讀一些      
journalist
ls和*还是有区别,google一下看能不能解决      
for name in ‘ls’ 的话当然是错误的,因为这里用的是单引号,从该语句的作用来看应该是用反引号,即ESC键下方、1键左方的那个符号。

`ls`的意思是在此处引用反引号中的命令(这里是ls)的执行结果。      
嘿嘿,一google居然google到我刚来eden的贴子
关于bash编程常见错误的总结,我再总结一下自己的体会
总结:
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编程常见错误的总结网址:
http://tech.idv2.com/2008/01/09/bash-pitfalls/

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

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

      
在处理命令的输出时, 经常要注意空格、引号等特殊字符的影响.

针对 9 楼的帖子:
1. 严格的讲, find | read 模式也是有问题的, read 会对反斜杠 \ 有特殊处理
2. echo "$name" 跟 echo $name 还是有区别的. 比如 name 中有两个连续空格的时候