集合大家的力量,供我成长壮大

文章 - 22 评论 - 1 收藏 - 0 粉丝 - 0 访问量 - 21218
 
11.2 特殊参数变量
bash shell中有一些用于跟踪命令行参数的特殊变量。本节描述了这些变量,以及如何使用它们。
11.2.1 对参数进行计数
如上节所述,在脚本中使用参数之前对其进行验证是一种很好的方法。但对于使用多个命令行参数的脚本来说,这非常容易让人厌倦。
与其验证每一个参数,不如计算命令行上一共输入了多少个参数。为此,bash shell提供一个特殊的变量。
这个特别的$#变量包含运行的脚本中包含的命令行参数的个数。可以像普遍变量一样,在脚本的任意地方使用此变量:
$ cat test8
#!/bin/bash
# getting the number of parameters
echo There were $# parameters supplied.
$ ./test8
There were 0 parameters supplied.
$ ./test8 1 2 3 4 5
There were 5 parameters supplied.
$ ./test8 1 2 3 4 5 6 7 8 9 10
There were 10 parameters supplied.
$ ./test8 "Rich Blum"
There were 1 parameters supplied.
$
现在,您可以在使用参数之前测试参数的个数了。
$ cat test9
#!/bin/bash
# testing parameters
if [ $# -ne 2 ]
then
echo Usage: test9 a b
else
total=$[ $1 + $2 ]
echo The total is $total
fi
$ ./test9
Usage: test9 a b
$ ./test9 10
Usage: test9 a b
$ ./test9 10 15
The total is 25
$ ./test9 10 15 20
Usage: test9 a b
$
if-then语句使用test命令执行命令行上提供的参数个数的测试。如果出现的参数不正确,则打印一则错误消息,显示脚本的正确用法。
获取最后一个输入的参数:
$ cat test10
#!/bin/bash
# grabbing the last parameter
params=$#
echo The last parameter is $params
echo The last paramerer is ${!#}
$ ./test10 1 2 3 4 5
The last parameter is 5
The last paramerer is 5
$ ./test10
The last parameter is 0
The last parameter is ./test10
$
11.2.2 抓取所有数据
有时,需要抓取命令行上提供的所有参数并在这些参数中递归。与其使用$#参数确定命令行上使用了多少参数,然后在这些参数中递归,还不如使用一些其他的特殊参数。
$*和$@变量为获取所有参数提供了一站式服务。这两个变量将所有命令行参数包括在单个变量中。
$*变量将命令行上提供的所有参数看作一个单词。这个单词包含命令行上出现的每个值。简而言之,$*不是将各个参数看作几个对象,而是将它们看作一个参数。
而$@变量将命令行上提供的所有参数当作一个字符串中的几个单词。它允许在值中递归,分隔提供的每个参数。通常,这是通过for命令完成的。
这两个变量的操作方式很容易让人混淆。如果只看表面,则根本看不出它们的区别:
$ cat test11
#!/bin/bash
# testing $* and $@
echo "Using the \$* method: $*"
echo "Using the \$@ method: $@"
$ ./test11 rich barbara katie jessica
Using the $* method: rich barbara katie jessica
Using the $@ method: rich barbara katie jessica
$
请注意,从表面上看,两个变量产生的输出相同,一次显示提供的所有命令行参数。
现在,下面的示例展示了它们的不同之处:
$ cat test12
#!/bin/bash
# testing $* and $@
count=1
for param in "$*"
do
echo "\$* Parameter #$count = $param"
count=$[ $count + 1 ]
done
count=1
for param in "$@"
do
echo "\$@ Parameter #$count = $param"
count=$[ $count + 1 ]
done
$ ./test12 rich barbara katie jessica
$* Parameter #1 = rich barbara katie jessica
$@ Parameter #1 = rich
$@ Parameter #2 = barbara
$@ Parameter #3 = katie
$@ Parameter #4 = jessica
$
现在,我们看到区别了。通过使用for命令在特殊的变量中递归,可以看出它们是如何区别地处理命令行参数的。$*变量将所有参数看作一个单词,而$@变量可以区分每个参数。这是一种在命令行参数中递归的好方法。
发表于: 2009-04-20 14:43 ivy 阅读(1058) 评论(0) 收藏 好文推荐

本博客所有内容,若无特殊声明,皆为博主原创作品,未经博主授权,任何人不得复制、转载、摘编等任何方式进行使用和传播。

作者该类其他博文:

发表评论(网友发言只代表个人观点,不代表本网站观点或立场。)

您尚未登录,请先【登录或注册

个人档案

<2020年2月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
1234567

最近来访

留言簿(0)

文章分类

文章档案


最新评论

非常详细!!&nbsp;太谢谢了!!--【匿名用户】:E-works热心网友

阅读排行榜

评论排行榜