给sh 脚本传递参数时,需要解析参数,命令后提供的所有的以空格分隔的内容对shell来说都是参数。传入的参数有两种类型 一种是开关参数:只有参数不需要指定参数值;另一种是含值参数:提供指定参数的值。当指定含值参数时,还需要紧随其后指定一个参数作为前面含值参数的值。
为了能被getopts识别,提交命令行时,参数名需要 以"-"标记。如果是含值参数则参数值紧随其后以空格分隔且不需要"-"标记。
getopts 每次被调用都获取一个参数,并记录下一个参数的位置。为此有两个内置的变量OPTIND 和OPTARG。OPTIND初始值为1,getopts调用读取参数后,将OPTIND 设置为下一个待处理的参数的位置;OPTARG是当前参数的值,getopts 读取参数时,如果发现参数时数值参数,如果紧邻的下一个参数是没有"-"标识,则把该参数当做前一个参数的值,如果紧邻的这个参数有"-"标识,则将OPTARG置位空。 getopts分析参数时,数值参数后需要用":"标记,开关类型参数不需要。getopts处理数值参数时,会将紧邻的无"-"标识的参数当做数值参数的值,因此在一次getopts调用中分析了两个参数,因此OPTIND的值会被加2.
echo '$*' $*
echo '$0='$0 '$1='$1 '$2='$2 '$3='$3 '$4='$4 '$5='$5 '$6='$6 '$7='$7 '$8='$8 '$9='$9 '$10='"${10}" '$11='"${11}" '$12='"${12}" '$13='"${13}" '$14='${14} '$15='${15}
echo OPTIND=$OPTIND
while getopts "a:b:cdef:g" para
do
echo OPTIND=$OPTIND
case $para in
a) echo "[a]OPTIND=$OPTIND OPTARG=$OPTARG"
echo "--------a-----------";;
b) echo "[b]OPTIND=$OPTIND OPTARG=$OPTARG"
echo "--------b-----------";;
c) echo "[c]OPTIND=$OPTIND OPTARG=$OPTARG"
echo "--------c-----------";;
d) echo "[d]OPTIND=$OPTIND OPTARG=$OPTARG"
echo "--------d-----------";;
e) echo "[e]OPTIND=$OPTIND OPTARG=$OPTARG"
echo "--------e-----------";;
f) echo "[f]OPTIND=$OPTIND OPTARG=$OPTARG"
echo "--------f-----------";;
g) echo "[g]OPTIND=$OPTIND OPTARG=$OPTARG"
echo "--------g-----------";;
esac
done
shift 1
echo $*
shift 1
echo $*
shift 1
echo $*
shift 1
echo $*
echo '$0='$0 '$1='$1 '$2='$2 '$3='$3 '$4='$4 '$5='$5 '$6='$6 '$7='$7 '$8='$8 '$9='$9 '$10='"${10}" '$11='"${11}" '$12='"${12}" '$13='"${13}" '$14='${14} '$15='${15}
下面是脚本测试输出:
csp12au():/home/scnzqz $> ./test.sh -a aaa -b bbb -c -d -e -f fff -g
$* -a aaa -b bbb -c -d -e -f fff -g
$0=./test.sh $1=-a $2=aaa $3=-b $4=bbb $5=-c $6=-d $7=-e $8=-f $9=fff $10=-g $11= $12= $13= $14= $15=
OPTIND=1
OPTIND=3
[a]OPTIND=3 OPTARG=aaa
--------a-----------
OPTIND=5
[b]OPTIND=5 OPTARG=bbb
--------b-----------
OPTIND=6
[c]OPTIND=6 OPTARG=
--------c-----------
OPTIND=7
[d]OPTIND=7 OPTARG=
--------d-----------
OPTIND=8
[e]OPTIND=8 OPTARG=
--------e-----------
OPTIND=10
[f]OPTIND=10 OPTARG=fff
--------f-----------
OPTIND=11
[g]OPTIND=11 OPTARG=
--------g-----------
aaa -b bbb -c -d -e -f fff -g
-b bbb -c -d -e -f fff -g
bbb -c -d -e -f fff -g
-c -d -e -f fff -g
$0=./test.sh $1=-c $2=-d $3=-e $4=-f $5=fff $6=-g $7= $8= $9= $10= $11= $12= $13= $14= $15=