获取Shell最后一个参数
October 6, 2009
在水木上看到这个帖子,本来觉得自己看过一遍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仅此一处,好好看看,别漏过去,呵呵…
太好了!真是好人!帮了大忙!