runlevel=$(set -- $(runlevel); eval "echo \$$#" ) 什么意思?

runlevel=$(set -- $(runlevel); eval "echo \$$#" ) 什么意思?

runlevel=$(set -- $(runlevel); eval "echo \$$#" )

eval:当shell程序执行到eval语句时,shell读入参数args,并将他们组合成一个新的命令,然后执行。

$#:位置参数的数量。

可是我不能把这些组织起来。      
看不懂      
语法上明白, 但不知道你想做什么. 这样试试:
$ (set -- a; echo $#)
$ (set -- a b; echo $#)
$ (set -- a b c; echo $#)
--------------------------------
上面的解释不能说明问题, 请往下看      
runlevel=$(set -- $(runlevel); eval "echo \$$#" )

我是这样理解的,版主看看对不对:
eval "echo \$$#===》执行echo \$$#
$(runlevel)===>把runlevel执行的结果变成字符串!

现在关键是不明白
set --
这个--是干什么的。

但是:
[I]eval "echo \$$#"[/I]
[B]3[/B]
[I]echo \$$[/I]
[B]$2[/B]
这个输出也不对呀!      
1) set 后面的 -- 可以不要的
2) 我明白 runlevel=$(set -- $(runlevel); eval "echo \$$#" ) 的意思了: 它就是要将当前的运行级赋值给变量 runlevel
3) set x y z; eval "echo \$$#" 这样理解: 首先 set 命令将 positional parameter 置成 x y z, 也就是说 $1=x, $2=y, $3=z, $#=3.
eval "echo \$$#" 分两步执行, 首先 shell 将双引号中的 \$ 替换成 $, $# 替换成 3, 然后再执行 eval "echo $3", 而 $3 就是 z 了, 所以结果显式 z
4) 这种用法我是第一次见, 还是很巧妙的      
下面几句也有助于理解:
$ x="hello, world"
$ y=x
$ eval "echo \$$y" ## 结果显式 hello, world      
谢谢了,我也明白了!
这是/etc/rc.d/init.d/firstboot里的!      
太神奇了:
x="hello world"
echo \$$y
[I]$[/I]
echo \$$x
[I]$hello world[/I]
eval "echo \$$x"
[I]world[/I]
y=x
eval "echo \$$y"
[I]hello world[/I]
echo \$$y
[I]$x[/I]
eval "echo \$$y"
[I]hello world[/I]      
呵呵, 明白了也就不神奇了      
补充:

runlevel输出是:
N 3


runlevel=$(set -- $(runlevel); eval "echo \$$#" )

实际就是把哪个3给runlevel。

\$$#
为什么要‘\’呢
$$
是进程ID
加‘\’就区别开了。