详解shell中脚本参数传递的两种或者是三种方式:命令方式和两个脚本之间传递参数的的全局变量方式

详解shell中脚本参数传递的两种方式

 更新时间:2021年03月21日 10:09:04   作者:随风丶逆风  

这篇文章主要介绍了详解shell中脚本参数传递的两种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

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

1.1 示例:新建一个test.sh的文件

1

2

3

4

#!/bin/bash

echo "脚本$0"

echo "第一个参数$1"

echo "第二个参数$2"

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

$ ./test.sh 1 2

#shell中将会输出:
脚本./test.sh
第一个参数1
第二个参数2

1.2 下面是参数超过10个的情况,在test.sh文件写入

1

2

3

4

5

6

7

8

9

#!/bin/bash

echo "脚本名$0"

echo "第一个参数$1"

echo "第二个参数$2"

echo "第三个参数$3"

echo "第四个参数$4"

……

echo "第十个参数$10"

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

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

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

#shell中将会输出:
脚本名./test.sh
第一个参数a
第二个参数b
第三个参数c
第四个参数d
第五个参数e
第六个参数f
第七个参数g
第八个参数h
第九个参数i
第十个参数a0
第十个参数j

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

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

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

方式二:getopts

语法格式:getopts [option[:]] [DESCPRITION] VARIABLE
 option:表示为某个脚本可以使用的选项
":":如果某个选项(option)后面出现了冒号(":"),则表示这个选项后面可以接参数(即一段描述信息DESCPRITION)
VARIABLE:表示将某个选项保存在变量VARIABLE中

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

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中执行脚本,结果如下

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

#在shell中的输出
参数a的值1
参数b的值2
参数c的值3

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

#在shell中的输出
参数a的值1
参数c的值3

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

#在shell中的输出
参数a的值1
参数c的值3
未知参数

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

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

总结:推荐使用getopts的方式进行参数传递

方式三:声明变量 直接引用

先在test1.sh脚本中声明变量AA BB CC DD

1

2

3

4

AA=11

BB=22

CC=33

DD=44

在test2.sh脚本中引用变量AA BB CC并打印

1

echo $AA $BB $CC $AA

注意:执行脚本的时候使用(. 脚本名)可以引用脚本外声明的变量,使用(sh 脚本名)不能引用局部之外的变量

https://www.jb51.net/article/197540.htm

Shell脚本传递参数的3种方法比较

 更新时间:2015年05月08日 09:43:37   投稿:junjie  

这篇文章主要介绍了Shell脚本传递参数的3种方法比较,本文直接给出代码示例,在代码中包含详细注解,需要的朋友可以参考下

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

#!/bin/bash

#extracting command text_text_text_line options as parameters

help_info(){

  echo "NAME"

  echo "\t$0"

  echo "SYNOPSIS"

  echo "\t$0 is a shell test about process options"

  echo "DESCRIPTION"

  echo "\toption like -a -b param1 -c param2 -d"

}

if [ $# -lt 0 ]

then

  help_info

fi

nomal_opts_act()

{

  echo -e "\n### nomal_opts_act ###\n"

  while [ -n "$1" ]

  do

  case "$1" in

    -a)

      echo "Found the -a option"

      ;;

    -b)

      echo "Found the -b option"

      echo "The parameter follow -b is $2"

      shift

      ;;

    -c)

      echo "Found the -c option"

      echo "The parameter follow -c is $2"

      shift

      ;;

    -d)

      echo "Found the -d option"

      ;;

     *)

       echo "$1 is not an option"

      ;;

  esac

  shift

  done

}

#用shell命令自建的选项解析,可以按照自己的想法实现

#优点:自己定制,没有做不到,只有想不到

#缺点:麻烦

getopt_act()

{

  echo -e "\n### getopt_act ###\n"

  GETOPTOUT=`getopt ab:c:d "$@"`

  set -- $GETOPTOUT

  while [ -n "$1" ]

  do

  case $1 in

    -a)

      echo "Found the -a option"

      ;;

    -b)

      echo "Found the -b option"

      echo "The parameter follow -b is "$2""

      shift

      ;;

    -c)

      echo "Found the -c option"

      echo "The parameter follow -c is "$2""

      shift

      ;;

    -d)

      echo "Found the -d option"

      ;;

    --)

      shift

      break

      ;;

     *)

       echo "Unknow option: "$1""

      ;;

  esac

  shift

  done

  param_index=1

  for param in "$@"

  do

    echo "Parameter $param_index:$param"

    param_index=$[ $param_index + 1 ]

  done

}

#用getopt命令解析选项和参数

#优点:相对与getopts来说是个半自动解析,自动组织选项和参数,用 -- 符号将选项与参数隔开

#缺点:相对于getopts的缺点

#1.需要与set -- 命令配合,不是必须,需要手动shift

#2.选项参数中不支持空格如 -a -b dog -c "earth moon" -d -f param1 param2 就会解析错误

getopts_act()

{

  echo -e "\n### getopts_act ###\n"

  while getopts :ab:c:d ARGS

  do

  case $ARGS in

    a)

      echo "Found the -a option"

      ;;

    b)

      echo "Found the -b option"

      echo "The parameter follow -b is $OPTARG"

      ;;

    c)

      echo "Found the -c option"

      echo "The parameter follow -c is $OPTARG"

      ;;

    d)

      echo "Found the -d option"

      ;;

     *)

       echo "Unknow option: $ARGS"

      ;;

  esac

  done

  shift $[ $OPTIND -1 ]

  param_index=1

  for param in "$@"

  do

    echo "Parameter $param_index:$param"

    param_index=$[ $param_index + 1 ]

  done

}

#getopts 命令解析选项和参数

#优点:可在参数中包含空格如:-c "earth moon"

#      选项字母和参数值之间可以没有空格如:-bdog

#      可将未定义的选项绑定到?输出

#      Unknow option: ?

nomal_opts_act -a -b dog -c earth -d -f param1 param2

getopts_act -a -b dog -c "earth moon" -d -f param1 param2

getopt_act -a -b dog -c earth -d -f param1 param2

https://www.jb51.net/article/65681.htm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值