分享

和即将用到Shell的人们谈谈Shell传递参数

 大文豪贤斌学长 2020-05-02

方式一:$0,$1,$2..

在shell编程时.可以使用参数。Shell有位置参数和内部参数:

1. 位置参数

由系统提供的参数称为位置参数。位置参数的值可以用$N得到,N是一个数字,如果为1,即$1。类似C语言中的数组,Linux会把输入的命令字符串分段并给每段进行标号,标号从0开始。第0号为程序名字,从1开始就表示传递给程序的参数。如$0表示程序的名字,$1表示传递给程序的第一个参数,以此类推。

我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……

采用$0,$1,$2..等方式获取脚本命令行传入的参数,值得注意的是,$0获取到的是脚本路径以及脚本名,后面按顺序获取参数,当参数超过10个时(包括10个),需要使用${10},${11}....才能获取到参数,但是一般很少会超过10个参数的情况。

实例

以下实例我们向脚本传递三个参数,并分别输出,其中 $0 为执行的文件名:

#!/bin/bash

# author:Agile Tao

echo "Shell 传递参数实例!";

echo "执行的文件名:$0";

echo "第一个参数为:$1";

echo "第二个参数为:$2";

echo "第三个参数为:$3";

echo "第四个参数为:$4"

……

echo "第十个参数为:$10"

echo "第十个参数为:${10}"

为脚本设置可执行权限,并在shell中执行脚本,如下

$ chmod +x first.sh

$ ./first.sh a b c d e f g h i j

#shell中将会输出:

执行的文件名:first.sh

第一个参数为:a

第二个参数为:b

第三个参数为:c

第四个参数为:d

第五个参数为:e

第六个参数为:f

第七个参数为:g

第八个参数为:h

第九个参数为:i

第十个参数为:a0

第十个参数为:j

可以看到${10}正确读取到了第十个参数,而$10被分成$1读取到第一个参数a然后拼接字符串0,于是输出a0。

方式一优点:获取参数更容易,执行脚本时需要的输入少

方式一缺点:必须按照顺序输入参数,如果中间漏写则参数对应就会错误

2. 内部参数

上述过程中的$0是一个内部变量,它是必须的,而$1则可有可无。和$0一样的内部变量还有以下几个。

参数处理说明

$# 传递到脚本的参数个数

$* 以一个单字符串显示所有向脚本传递的参数。

如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。

$$ 脚本运行的当前进程ID号

$! 后台运行的最后一个进程的ID号

$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。

如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。

$- 显示Shell使用的当前选项,与set命令功能相同。

$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

#!/bin/bash

# author:Agile Tao

echo "Shell 传递参数实例!";

echo "第一个参数为:$1";

echo "参数个数为:$#";

echo "传递的参数作为一个字符串显示:$*";

执行脚本,输出结果如下所示:

$ chmod +x first.sh

$ ./first.sh 1 2 3

Shell 传递参数实例!

第一个参数为:1

参数个数为:3

传递的参数作为一个字符串显示:1 2 3

$* 与 $@ 区别:

相同点:都是引用所有参数。

不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。

#!/bin/bash

# author:Agile Tao

echo "-- \$* 演示 ---"

for i in "$*"; do

echo $i

done

echo "-- \$@ 演示 ---"

for i in "$@"; do

echo $i

done

执行脚本,输出结果如下所示:

$ chmod +x first.sh

$ ./first.sh 1 2 3

-- $* 演示 ---

1 2 3

-- $@ 演示 ---

1

2

3

方式二:getopts

语法格式:getopts [option[:]] [DESCPRITION] VARIABLE

option:表示为某个脚本可以使用的选项

":":如果某个选项(option)后面出现了冒号(":"),则表示这个选项后面可以接参数(即一段描述信息DESCPRITION)

VARIABLE:表示将某个选项保存在变量VARIABLE中

示例:同样新建一个first.sh文件

while getopts ":a:b:c:" opt

do

case $opt in

a)

echo "参数a的值$OPTARG"

;;

b)

echo "参数b的值$OPTARG"

;;

c)

echo "参数c的值$OPTARG"

;;

?)

echo "未知参数"

exit 1;;

esac

done

用一个while循环加case分支获取不同参数,:a:b:c相当于定义参数的变量名,有时候可能会有未知参数,所以增加一个?的分支。

在shell中执行脚本,结果如下

$ ./first.sh -a 1 -b 2 -c 3

#在shell中的输出

参数a的值1

参数b的值2

参数c的值3

$ ./first.sh -a 1 -c 3

#在shell中的输出

参数a的值1

参数c的值3

$ ./first.sh -a 1 -c 3 -d 4

#在shell中的输出

参数a的值1

参数c的值3

未知参数

优点:由于使用了-a加参数值的方式进行一一匹配,所以不会参数匹配错误,同时也可以缺省参数,并不会导致参数错误,同时也便于后期参数的扩展和移植

方式二的缺点:脚本执行时参数需要的输入会增多

总结:方式一优点:获取参数更容易,执行脚本时需要的输入少,方式一缺点:必须按照顺序输入参数,如果中间漏写则参数对应就会错误;方式二的缺点:脚本执行时参数需要的输入会增多,推荐使用getopts的方式进行参数传递。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多