帮我解释一下这个语句好么

帮我解释一下这个语句好么

1      #!/bin/bash
2      count=$#
3      cmd=echo
4      while true
5      do
6         cmd="$cmd \$$count"           #这里
7         let count=$count-1
8         if   [ $count -eq 0 ]
9         then   break
10       fi
11    done
12    eval $cmd                                #这里
13    #end

①那个第六句我不明白,我换成:
cmd "$cmd \$$count"
$cmd "$cmd \$$count"
$cmd="$cmd \$$count"
都不行.能解释一下为什么么?最好通俗一些.三四岁的话.
②第十二句的eval啥意思呢?
③还有我发现有个在shell里有个{},比如${dir},(dir是用户变量),作何解释?
cmd = "cmd" 加上"$"加上数字“count”
比方说cmd变成 sed $1这样子
eval
  命令格式:eval args
  功能:当shell程序执行到eval语句时,shell读入参数args,并将它们组合成一个新的命令,然后执行。

③还有我发现有个在shell里有个{},比如${dir},(dir是用户变量),作何解释?
[quote:c48374945c="huahuaxuwei"]③还有我发现有个在shell里有个{},比如${dir},(dir是用户变量),作何解释?[/quote]${arg}是变量置换,和$arg有一些小区别
何区别啊?我就想知道区别!
[quote:2f65e3e2a7="huahuaxuwei"]何区别啊?我就想知道区别![/quote]
我目前只知道两种情况下应该用${}来引用变量的值,如果你知道更多的情况,还请不吝赐教

1:超过9个位置参数时,第十个以后的位置参数的值需要使用${}来获得;
e.g:
[code:1]
#!/bin/sh

echo $10
echo ${10}
[/code:1]
在上面的例子代码中,输入至少10个位置参数,然后看看结果,你就知道有何区别了。
2:当变量作为一个字符串中的一部分时:
[code:1]
#!/bin/sh

a=100
echo "a is $a"
echo "abcd is $abcd"
echo "abcd is ${a}bcd"
[/code:1]
注意结合脚本看看输出结果。

有不对之处还请多多指教。
我的理解:eval之所以要用在这里,关键在于其能够解决$$的问题
就像楼主实验的那样
[code:1]
``
$()
[/code:1]
都不能支持$$格式
man eval的结果中说的比较清楚了
[code:1]
NAME
       eval - construct command by concatenating arguments
[/code:1]
至于${}的使用,就如楼上所说。
ps:楼主需要补下shell知识
[quote:a38a41627e="demonlj"]我的理解:eval之所以要用在这里,关键在于其能够解决$$的问题
就像楼主实验的那样
[code:1]
``
$()
[/code:1]
都不能支持$$格式
man eval的结果中说的比较清楚了
[code:1]
NAME
       eval - construct command by concatenating arguments
[/code:1]
[/quote]这个问题我碰到过,后来也是用eval解决的
目前只想到这种方法来解决$arg_$arg2变量的问题
me2,不过现在用shell的时间少了很多。主要有时候会用perl来替换下,说不上来哪个就更好些。但有时候就是想换着用
ps:perl解决这些变量的问题比较easy
不错的讨论 精华了