shell 的位置参数

2023-05-16

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 的形式传递的,这样将会去掉空白,位置参数个数将不确定。

$@ 是以 $1 $2 ... $n 的形式传递的,这样将会去掉空白,位置参数个数将不确定。

3 "$*" 是以 "$1 $2 ..." 形式传递的,所以传递后的位置参数仅有一个。

4 "$@" 是以 "$1" "$2" ... 的形式传递的,所以传递后的位置参数能原样保持,且能保留空白。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

shell 的位置参数 的相关文章

随机推荐