处理位置参数 集体
有时将所有位置参数作为一个组进行管理很有用。 例如,我们可能想围绕另一个程序编写一个“包装器”。 这意味着我们创建了一个脚本或 shell 函数来简化另一个程序的调用。 在这种情况下,包装器提供了一个神秘的命令行选项列表,然后将一个参数列表传递给低级程序。
为此,shell 提供了两个特殊参数。 它们都扩展为位置参数的完整列表,但在相当微妙的方面有所不同。 他们是:
表 32-1:* 和 @ 特殊参数
参数说明
参数说明
$* 扩展为位置参数列表,从 1 开始。当被双引号包围时,它扩展为包含所有位置参数的双引号字符串,每个位置参数由 IFS shell 变量的第一个字符分隔(默认情况下为空格特点)。
$@ 展开到位置参数列表中,从1开始。当被双引号包围时,它将每个位置参数展开成一个被双引号包围的单独单词。
这是一个显示这些特殊参数的脚本:
整体处理位置参数
#!/斌/庆典
# posit-params3: 脚本来演示 $* 和 $@ print_params() {
echo "\$1 = $1" echo "\$2 = $2" echo "\$3 = $3" echo "\$4 = $4"
}
pass_params() {
echo -e "\n" '$* :'; print_params $* echo -e "\n" '"$*" :'; print_params "$*" echo -e "\n" '$@ :'; print_params $@ echo -e "\n" '"$@" :'; print_params "$@"
}
pass_params "word" "带空格的单词"
#!/斌/庆典
# posit-params3: 脚本来演示 $* 和 $@ print_params() {
echo "\$1 = $1" echo "\$2 = $2" echo "\$3 = $3" echo "\$4 = $4"
}
pass_params() {
echo -e "\n" '$* :'; print_params $* echo -e "\n" '"$*" :'; print_params "$*" echo -e "\n" '$@ :'; print_params $@ echo -e "\n" '"$@" :'; print_params "$@"
}
pass_params "word" "带空格的单词"
在这个相当复杂的程序中,我们创建了两个参数:“word”和“words with space”,并将它们传递给 传递参数 功能。 反过来,该函数将它们传递给 打印参数 函数,使用带有特殊参数的四种方法中的每一种 $* 和 $@. 执行时,脚本显示了差异:
[我@linuxbox ~]$ 位置参数3
$* :
$1 | = | 字 |
$2 | = | 话 |
$3 | = | - |
$4 | = | 剩余名额 |
"$*" :
$1 | = | 带空格的单词 |
$2 | = | |
$3 | = | |
$4 | = |
$@ :
$1 | = | 字 |
$2 | = | 话 |
$3 | = | - |
$4 | = | 剩余名额 |
"$@" :
$1 = 字
$2 = 带空格的单词
$ 3 =
$ 4 =
$2 = 带空格的单词
$ 3 =
$ 4 =
根据我们的论点,双方 $* 和 $@ 产生一个四字结果:
带空格的单词
"$*" 产生一个单词结果:
“带空格的单词”
"$@" 产生两个字的结果:
"word" "带空格的单词"
这符合我们的实际意图。 从中吸取的教训是,尽管 shell 提供了四种不同的方式来获取位置参数列表,”$@" 在大多数情况下是迄今为止最有用的,因为它保留了每个位置参数的完整性。