一、getopts命令简介
getopts命令是用来解析Shell脚本命令行参数的工具,getopts命令参数包含需要被识别的选项字符,如果选项字符后面跟着一个冒号,则表明该字符选项需要一个命令行参数(选项字符与对应的命令行参数之间以空格分隔)(注意:冒号&问号不能被用作为选项字符)。getopts命令每次被调用时,它会将下一个选项字符放置到变量中,OPTARG则可以拿到参数值;如果option前面加冒号,则代表忽略错误
1.1 命令使用格式
getopts optstring name [arg...]
- optstring列出了对应的Shell脚本可以识别的所有参数,例如:需要使用-a,-f,-s参数时,optstring是afs;如果需要命令行参数后面还跟随一个值,则在相应的optstring后面加冒号,例如a:fs 表示a命令行参数后面会有一个值,是**-a value**的形式;
- getopts执行时若匹配到a参数,会把-a参数对应的value存放在一个叫OPTARG的Shell Variable中;
- 如果optstring是以冒号开头,则表明当命令行出现了optstring中没有的参数将不会提示错误信息
二、示例
在Shell脚本中,对于简单的参数,常常会使用$1,2 , . . . , n来处理即可。但当命令行参数过多或者我们需要区分命令行参数用途时,就需要使用getopts命令
2.1
#!/bin/bash
func() {
echo "Usage:"
echo "test.sh [-j S_DIR] [-m D_DIR]"
echo "Description:"
echo "S_DIR,the path of source."
echo "D_DIR,the path of destination."
exit -1
}
upload="false"
while getopts 'h:j:m:u' OPT; do
case $OPT in
j) S_DIR="$OPTARG";;
m) D_DIR="$OPTARG";;
u) upload="true";;
h) func;;
?) func;;
esac
done
echo $S_DIR
echo $D_DIR
echo $upload
情况1:
sh test.sh -j /data/usw/web -m /opt/data/web
##输出结果
/data/usw/web
/opt/data/web
false
情况2:
getopts命令的选项字符中,如果是没有跟随 : 的字母就是开关型选项,不需要指定值,等同于true/false,只要带上了这个参数就是true。如下示例中的 -u
getopts命令识别出各个选项之后,就可以配合case进行操作。操作中,有两个"常量",一个是OPTARG,用来获取当前选项的值;另外一个就是OPTIND,表示当前选项在参数列表中的位移。case的最后一项是?,是用来识别非法的选项,并进行相应的操作,我们的脚本中是输出了帮助信息
sh test.sh -j /data/usw/web -m /opt/data/web -u
##输出结果
/data/usw/web
/opt/data/web
true
情况3:
sh test.sh -h
##输出结果
test.sh: option requires an argument -- h
Usage:
test.sh [-j S_DIR] [-m D_DIR]
Description:
S_DIR,the path of source.
D_DIR,the path of destination.
情况4:
sh test.sh j
##输出结果
false
2.2
#!/bin/bash
func() {
echo "func:"
echo "test.sh [-j S_DIR] [-m D_DIR]"
echo "Description:"
echo "S_DIR, the path of source."
echo "D_DIR, the path of destination."
exit -1
}
upload="false"
echo $OPTIND
while getopts 'j:m:u' OPT; do
case $OPT in
j) S_DIR="$OPTARG";;
m) D_DIR="$OPTARG";;
u) upload="true";;
?) func;;
esac
done
echo $OPTIND
shift $(($OPTIND - 1))
echo $1
情况1:
sh test.sh -j /data/usw/web beijing
##输出结果
1
3
beijing
情况2:
sh test.sh -m /opt/data/web beijing
1
3
beijing
情况3:
sh test.sh -j /data/usw/web -m /opt/data/web beijing
1
5
beijing
情况4:
sh test.sh -j /data/usw/web -m /opt/data/web -u beijing
1
6
beijing