Linux——Shell脚本参数传递的2种⽅法
前⾔
平时会遇到很多脚本都有参数选项,类似:
./test.sh -f -v --prefix=/home
这种脚本怎么写呢?
⼀、Shell 特殊参数解释
⾸先来看⼏个特殊变量:$0, $#, $*, $@, $?, $$, $_
⽰例1:新建⼀个test.sh的⽂件
#!/bin/bash
echo $0    # 当前脚本的⽂件名(间接运⾏时还包括绝对路径)。
echo $n    # 传递给脚本或函数的参数。n 是⼀个数字,表⽰第⼏个参数。例如,第⼀个参数是 $1。
echo $#    # 传递给脚本或函数的参数个数。
echo $*    # 传递给脚本或函数的所有参数。
echo $@    # 传递给脚本或函数的所有参数。被双引号 ("") 包含时,与 $* 不同,下⾯将会讲到。
echo $?    # 上个命令的退出状态,或函数的返回值。
echo $$    # 当前 Shell 进程 ID。对于 Shell 脚本,就是这些脚本所在的进程 ID。
echo $_    # 上⼀个命令的最后⼀个参数
echo $!    # 后台运⾏的最后⼀个进程的 ID 号
执⾏结果如下:
$ ./test.sh test test1 test2 test3 test4
./test.sh                      # $0
# $n
5                              # $#
test test1 test2 test3 test4  # $*
test test1 test2 test3 test4  # $@
0                              # $?
12305                          # $$
12305                          # $_
# $!
$* 和 $@ 都表⽰传递给函数或脚本的所有参数,不被双引号 ("") 包含时,都以"$1""$2" … "$n" 的形式输出所有参数。
但是当它们被双引号 ("") 包含时,"$*"会将所有的参数作为⼀个整体,以"$1 $2 … $n"的形式输出所有参数;"$@"会将各个参数分开,以"$1""$2" … "$n" 的形式输出所有参数。
⼆、⽅法1:$0,$1,$2..
采⽤$0,$1,$2..等⽅式获取脚本命令⾏传⼊的参数,值得注意的是,$0获取到的是脚本路径以及脚本名,后⾯按顺序获取参数,当参数超过10个时(包括10个),需要使⽤${10},${11}....才能获取到参数。
⽰例2:新建⼀个test.sh的⽂件
#!/bin/bash
echo "脚本$0"
echo "第⼀个参数$1"
echo "第⼆个参数$2"
执⾏结果如下:
$ ./test.sh 12
#shell中将会输出:
脚本./test.sh
第⼀个参数1
第⼆个参数2
⽰例3:参数超过10个的情况,在test.sh⽂件写⼊
#!/bin/bash
echo "脚本名$0"
echo "第⼀个参数$1"
echo "第⼆个参数$2"
echo "第三个参数$3"
echo "第四个参数$4"
……
echo "第⼗个参数$10"
echo "第⼗个参数${10}"
执⾏结果如下:
$ ./test.sh a b c d e f g h i j
#shell中将会输出:
脚本名./test.sh
第⼀个参数a
第⼆个参数b
第三个参数c
第四个参数d
第五个参数e
第六个参数f
第七个参数g
第⼋个参数h
第九个参数i
第⼗个参数j
优点:获取参数更容易,执⾏脚本时需要的输⼊少
缺点:必须按照顺序输⼊参数,如果中间漏写则参数对应就会错误
三、⽅法2:getopts
语法格式:getopts [option[:]] [DESCPRITION] VARIABLE
option:表⽰为某个脚本可以使⽤的选项
":":如果某个选项(option)后⾯出现了冒号(":"),则表⽰这个选项后⾯可以接参数(即⼀段描述信息DESCPRITION)VARIABLE:表⽰将某个选项保存在变量VARIABLE中
⽰例4:新建⼀个test.sh⽂件
while getopts ":a:b:c:" opt
do
case $opt in
a)
echo "参数a的值$OPTARG"
;;
b)
echo "参数b的值$OPTARG"
linux循环执行命令脚本
;;
c)
echo "参数c的值$OPTARG"
;;
)
echo "未知参数"
exit 1;;
      :)
echo "没有输⼊任何选项 $OPTARG"
    ;;
esac done
⽤⼀个while循环加case分⽀获取不同参数,:a:b:c相当于定义参数的变量名,有时候可能会有未知参数,所以增加⼀个?的分⽀。执⾏结果如下:
$ ./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加参数值的⽅式进⾏⼀⼀匹配,所以不会参数匹配错误,同时也可以缺省参数,并不会导致参数错误,同时也便于后期参数的扩展和移植
缺点:脚本执⾏时参数需要的输⼊会增多

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。