getopts介绍
getpots是Shell命令行参数解析工具,旨在从Shell Script的命令行当中解析参数。
命令格式:
getopts optstring name [arg...]
用法:
optstring列出了对应的Shell Script可以识别的所有参数。比如:如果 Shell Script可以识别-a,-f以及-s参数,则optstring就是afs;如果对应的参数需要一个值,则在相应的optstring后面加冒号。比如,a:fs 表示a参数后面会有一个值出现,-a value的形式。另外,getopts执行匹配到a的时候,会把value存放在一个叫OPTARG的Shell Variable当中。如果 optstring是以冒号开头的,命令行当中出现了optstring当中没有的参数将不会提示错误信息。
name表示的是参数的名称,每次执行getopts,会从命令行当中获取下一个参数,然后存放到name当中。如果获取到的参数不在optstring当中列出,则name的值被设置为?。命令行当中的所有参数都有一个index,第一个参数从1开始,依次类推。 另外有一个名为OPTIND的Shell Variable存放下一个要处理的参数的index。
举例:
[root@bj tmp]# cat test.sh #!/bin/bash func() { echo "Usage:" echo "test.sh [-j S_DIR] [-m D_DIR]" } 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 "j:"$S_DIR echo "m:"$D_DIR echo "u:"$upload
[root@bj tmp]# sh test.sh -j /data/usw/web -m /opt/data/web j:/data/usw/web m:/opt/data/web u:false [root@bj tmp]# sh test.sh -j /data/usw/web -m /opt/data/web -u j:/data/usw/web m:/opt/data/web u:true [root@bj tmp]# sh test.sh -j /data/usw/web j:/data/usw/web m: u:false [root@bj tmp]# sh test.sh -j /data/usw/web -a test.sh: illegal option -- a Usage: test.sh [-j S_DIR] [-m D_DIR] j:/data/usw/web m: u:false [root@bj tmp]# sh test.sh -j /data/usw/web -a /etc test.sh: illegal option -- a Usage: test.sh [-j S_DIR] [-m D_DIR] j:/data/usw/web m: u:false [root@bj tmp]# sh test.sh -a /etc test.sh: illegal option -- a Usage: test.sh [-j S_DIR] [-m D_DIR] j: m: u:false [root@bj tmp]# sh test.sh /etc /data j: m: u:false #注意 注意 注意 [root@bj tmp]# sh test.sh /home -j /data/usw/web -m /opt/data/web j: m: u:false [root@bj tmp]# sh test.sh -j /data/usw/web /home -m /opt/data/web j:/data/usw/web m: u:false #碰到不是optstring中的参数就不在获取了
可以看到,我们添加-a 参数会提示错误信息
如果把optstring改成是以冒号开头
:h:j:m:u
[root@bj tmp]# sh test.sh -j /data/usw/web -a /etc Usage: test.sh [-j S_DIR] [-m D_DIR] [root@bj tmp]# sh test.sh -a /etc Usage: test.sh [-j S_DIR] [-m D_DIR]
不会在提示错误信息了
上面的例子我们用到了OPTARG,另一个"常量"就是OPTIND,表示当前选项在参数列表中的位移。当选项参数识别完成以后,就能识别剩余的参数了,我们可以使用shift进行位移,抹去选项参数。
[root@bj tmp]# cat test2.sh #!/bin/bash func() { echo "Usage:" echo "test.sh [-j S_DIR] [-m D_DIR]" } upload="false" echo "OPTIND:"$OPTIND 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 "j:"$S_DIR echo "m:"$D_DIR echo "u:"$upload echo "OPTIND:"$OPTIND shift $(($OPTIND - 1)) echo $1
[root@bj tmp]# sh test.sh -j /data/ install OPTIND:1 j:/data/ m: u:false OPTIND:3 install [root@bj tmp]# sh test.sh -j /data/ -m /home install OPTIND:1 j:/data/ m:/home u:false OPTIND:5 install [root@bj tmp]# sh test.sh -j /data/ -a /home install OPTIND:1 test.sh: illegal option -- a Usage: test.sh [-j S_DIR] [-m D_DIR] j:/data/ m: u:false OPTIND:4 /home
在上面的脚本中,我们位移的长度等于case循环结束后的OPTIND - 1,OPTIND的初始值为1。当选项参数处理结束后,其指向剩余参数的第一个。getopts在处理参数时,处理带值的选项参数,OPTIND加2;处理开关型变量时,OPTIND则加1。
还没有评论,来说两句吧...