获取Shell最后一个参数

October 6, 2009
Tags: ,

在水木上看到这个帖子,本来觉得自己看过一遍Bash的manual已经对bash相当的了解了,没想到还有很多细节被忽略了,看来看manual和reference的时候,一定得相当的细心并且耐心才行啊…
说正事,如何显示shell脚本的最后一个参数呢?
$#这个bash内置变量记录了脚本接受到的参数个数,那么${$#}就应该可以显示最后一个参数了,可惜中括号里面是一个变量,bash作变量替换的时候,只进行一次扫描,那么上面的语法就被bash理解成了${name#substitute}这种语法了.

byang@byang-desktop:~$ echo $#
0
byang@byang-desktop:~$ echo $0
bash
byang@byang-desktop:~$ echo ${$#}
9033
byang@byang-desktop:~$ echo $$
9033
byang@byang-desktop:~$ echo ${$%}
9033
byang@byang-desktop:~$

如果要用如上方法,显示最后一个参数,那就只能让bash作两次变量替换,对,用eval。

byang@byang-desktop:~$ eval echo \${$#}
bash
byang@byang-desktop:~$

或者,使用bash提供的间接变量替换

byang@byang-desktop:~$ echo ${!#}
bash
byang@byang-desktop:~$

bash中以${!name}形式出现的变量替换,就是间接替换。bash首先,计算$name的值,并用它的值来替换中括号里面的值,再作一次变量替换。
这个语法,在bash的manual的一个小小的段落里面,真不明白这么重要的语法bash manual为什么不详细介绍一下。如果你在看bash manual的话,关于这种语法的介绍在3.5.3 Shell Parameter Expansion一节的第四段,或者可以打开bash manual,搜索indirect expansion,整个manual仅此一处,好好看看,别漏过去,呵呵…

1

从bash函数中返回任意值

September 11, 2009
Tags: , ,

http://codex.wordpress.org/Excerpt

0