positional parameters
位置参数(positional parameters)指的是 shell 脚本的命令行参数(command line argument),同时也表示 shell 函数的函数参数。
位置参数的名称是以单个整数来命名的。出于历史的原因,当这个整数大于 9 时(也就是包含两个或两个以上的阿拉伯数字),就应该使用花括号({})将其括起来。变量 ${nn} 表示第 nn 个位置参数;如不使用花括号,变量 $nn 的值不是第 nn 个位置参数的值,而是第 n 个位置参数的值后面加上 n。
如变量 $1、$2、$9、${11} 分别表示第一个、第二个、第九个、第十一个位置参数,依次类推。
位置参数是 shell 中唯一使用全部阿拉伯数字的特殊变量。
实例1:
假设 test.sh 文件的内容为:
#! /bin/bash
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 ${10} ${11};
执行的命令行参数为:bash test.sh 1 2 3 4 5 6 7 8 9 11 12
执行后输出:
1 2 3 4 5 6 7 8 9 10 11 12
在这个结果中 $10=10,${10}=11,${11}=12。变量 $10 实际上是 $1 后面加一个 0,所有结果是 10。
和位置参数有关的几个特殊变量
$#
表示传递到 shell 脚本或函数的参数总数(也就是命令行参数或函数参数的总数)。
当为了处理选项和参数而建立的循环时,这个变量非常有用。
$* $@
表示所有的命令行参数和函数参数。
"$*"
将所有的命令行参数和函数参数视为单个字符串。等同于 "$1 $2 ..."。
特殊变量 $IFS 的第一个字符用来作为分隔字符,通过不同的分隔字符来建立字符串。在使用 $IFS 时需要注意,这个变量是一个全局变量,在任何地方改变了其值,将立即生效。
"$@"
将所有的命令行参数和函数参数视为单个个体,也就是单独的字符串。等同于 "$1" "$2" ...。
这是将参数传递给其他程序(其他 shell 脚本、函数)的最佳方式,因为它会保留所有内嵌在每个位置参数里的任何空白。
实例1:
假设 test.sh 文件的内容为:
#! /bin/bash
test_times=0;
test_positional_parameters()
{
printf "func $test_times=%dn" $((test_times++));
printf "func $1=%sn" $1;
printf "func $2=%sn" $2;
printf "func $3=%sn" $3;
printf "func $#=%dn" $#;
printf "func $*=%sn" $*;
printf "func $@=%sn" $@;
printf "func $*=$*n";
printf "func "$*"=%sn" "$*";
printf "func "$@"=%sn" "$@";
}
test_positional_parameters $*;
test_positional_parameters $@;
test_positional_parameters "$*";
test_positional_parameters "$@";
printf "main $1=%sn" "$1";
printf "main $2=%sn" "$2";
printf "main $3=%sn" "$3";
printf "main $#=%dn" $#;
printf "main $*=%sn" $*;
printf "main $@=%sn" $@;
printf "main $*=$*n";
printf "main "$*"=%sn" "$*";
printf "main "$@"=%sn" "$@";
执行的命令行参数为:bash test.sh 1 "4 5"
执行后输出:
func $test_times=0
func $1=1
func $2=4
func $3=5
func $#=3
func $*=1
func $*=4
func $*=5
func $@=1
func $@=4
func $@=5
func $*=1 4 5
func "$*"=1 4 5
func "$@"=1
func "$@"=4
func "$@"=5
func $test_times=1
func $1=1
func $2=4
func $3=5
func $#=3
func $*=1
func $*=4
func $*=5
func $@=1
func $@=4
func $@=5
func $*=1 4 5
func "$*"=1 4 5
func "$@"=1
func "$@"=4
func "$@"=5
func $test_times=2
func $1=1
func $1=4
func $1=5
func $2=
func $3=
func $#=1
func $*=1
func $*=4
func $*=5
func $@=1
func $@=4
func $@=5
func $*=1 4 5
func "$*"=1 4 5
func "$@"=1 4 5
func $test_times=3
func $1=1
func $2=4
func $2=5
func $3=
func $#=2
func $*=1
func $*=4
func $*=5
func $@=1
func $@=4
func $@=5
func $*=1 4 5
func "$*"=1 4 5
func "$@"=1
func "$@"=4 5
main $1=1
main $2=4 5
main $3=
main $#=2
main $*=1
main $*=4
main $*=5
main $@=1
main $@=4
main $@=5
main $*=1 4 5
main "$*"=1 4 5
main "$@"=1
main "$@"=4 5
特殊变量 $* $@ "$*" "$@" 传递到其他程序时的区别
1 $* 是以 $1 $2 ... $n 的形式传递的,这样将会去掉空白,位置参数个数将不确定。
2 $@ 是以 $1 $2 ... $n 的形式传递的,这样将会去掉空白,位置参数个数将不确定。
3 "$*" 是以 "$1 $2 ..." 形式传递的,所以传递后的位置参数仅有一个。
4 "$@" 是以 "$1" "$2" ... 的形式传递的,所以传递后的位置参数能原样保持,且能保留空白。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)