shell处理用户输入——特殊参数变量

在bash shell中有一些跟踪命令行参数的特殊变量。

参数统计

在脚本中使用命令行参数之前应该检查一下位置变量。对使用多个命令行参数的脚步来说,这有点儿麻烦。

无须逐个测试,可以统计一下有多少个命令行参数。bash shell为此提供了一个特殊变量。

特殊变量$#含有脚本运行时携带的命令行参数的个数。你可以在脚本中的任何地方使用这个特殊变量,就跟普通变量一样:

$ cat countparameters.sh
#!/bin/bash
# Counting command-line parameters
#
if [ $# -eq 1 ]
then
    fragment="parameter was"
else
    fragment="parameters were"
fi
echo $# $fragment supplied.
$
$ ./countparameters.sh
0 parameters were supplied.
$
$ ./countparameters.sh Hello
1 parameter was supplied.
$
$ ./countparameters.sh Hello World
2 parameters were supplied.
$
$ ./countparameters.sh "Hello World"
1 parameter was supplied.

现在可以在使用之前测试命令行参数的数量了:

$ cat addem.sh
#!/bin/bash
# Adding command-line parameters
#
if [ $# -ne 2 ]
then
    echo Usage: $(basename $0) parameter1 parameter2
else
    total=$[ $1 + $2 ]
    echo $1 + $2 is $total
fi
exit
$
$ ./addem.sh
Usage: addem.sh parameter1 parameter2
$
$ ./addem.sh 17
Usage: addem.sh parameter1 parameter2
$
$ ./addem.sh 17 25
17 + 25 is 42

if-then语句用-ne测试检查命令行参数数量。如果数量不对,则会显示一条错误消息,告知脚本的正确用法。

这个变量还提供了一种简便方法来获取命令行中最后一个参数,完全不需要知道实际上到底用了多少个参数。不过要实现这一点,得费点儿事。

如果仔细考虑过,你可能会觉得既然$#变量含有命令行参数的总数,那么变量${$#}应该就代表了最后一个位置变量。试试看会发生什么:

$ cat badlastparamtest.sh
#!/bin/bash
# Testing grabbing the last parameter
#
echo The number or parameters is $#
echo The last parameter is ${$#}
exit
$
$ ./badlastparamtest.sh one two three four
The number of parameters is 4
The last parameter is 2648

显然,这种方法不管用。这说明不能在花括号内使用$,必须将$换成!。很奇怪,但的确有效: 

$ cat goodlastparamtest.sh 
#!/bin/bash
# Testing grabbing the last parameter
#
echo The number of parameters is $#
echo The last parameter is ${!#}
exit
$
$ ./goodlastparamtest.sh one two three four
The number of parameters is 4
The last parameter is four
$
$ ./goodlastparamtest.sh
The number of parameters is 0
The last parameter is ./goodlastparamtest.sh

完美。重要的是要注意,当命令行中没有任何参数时,$#的值即为0,但${!#}会返回命令行中的脚本名。

获取所有的数据

有时候你想要抓取命令行中的所有参数。这时无须先用$#变量判断有多少个命令行参数,然后再进行遍历,用两个特殊变量即可解决这个问题。

$*变量和$@变量可以轻松访问所有参数,它们各自包含了所有的命令行参数。

$*变量会将所有的命令行参数视为一个单词。这个单词含有命令行中出现的每一个参数。基本上,$*变量会将这些参数视为一个整体,而不是一系列个体。

另外,$@变量会将所有的命令行参数视为同一字符串中的多个独立的单词,以便你能遍历并处理全部参数。这通常使用for命令完成。

这两个变量的工作方式不太容易理解。下面来看一个例子,你就能明白二者之间的区别了:

$ cat grabbingallparams.sh
#!/bin/bash
# Testing different methods for grabbing all the parameters
#
echo
echo "Using the \$* method: $*"
echo
echo "Using the \$@ method: $@"
echo
exit
$
$ ./grabbingallparams.sh alpha beta charlie delta

Using the $* method: alpha beta charlie delta

Using the $@ method: alpha beta charlie delta

注意,从表面上看,两个变量产生的输出相同,均显示了所有命令行参数。下面的例子演示了不同之处:

$ cat grabdisplayallparams.sh
#!/bin/bash
# Exploring different methods for grabbing all the parameters
#
echo
echo "Using the \$* method: $*"
count=1
for param in "$*"
do
    echo "\$*" Parameter #$count = $param"
    count=$[ $count + 1 ]
done
#
echo
echo "Using the \$@ method: $@"
count=1
for param in "$@"
do
    echo "\$@" Parameter #$count = $param"
    count=$[ $count + 1 ]
done
echo
exit
$
$ ./grabdisplayallparams.sh alpha beta charlie delta

Using the $* method: alpha beta charlie delta
$* Parameter #1 = alpha beta charlie delta

Using the $@ method: alpha beta charlie delta
$@ Parameter #1 = alpha
$@ Parameter #2 = beta
$@ Parameter #3 = charlie
$@ Parameter #4 = delta

现在就清楚多了。通过使用for命令遍历这两个特殊变量,可以看出二者如何以不同的方式处理命令行参数。$*变量会将所有参数视为单个参数,而$@变量会单独处理每个参数。这是遍历命令行参数的一种绝妙方法。

这里再详细说明一下$*和$@的区别。当$*出现在双引号内时,会被扩展成由多个命令行参数组成的单个单词,每个参数之间以IFS变量值的第一个字符分隔,也就是说,"$*"会被扩展为"$1c$2c..."(其中c是IFS变量值的第一个字符)。当$@出现在双引号内时,其所包含的各个命令行参数会被扩展成独立的单词,也就是说,"$@"会被扩展为"$1""$2"...。

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值