在shell
脚本中,对于简单的参数,咱们使用$1 $2
来处理便可,具体以下:java
#!/bin/bash SOFT_DIR=$1 MAVEN_DIR=$2 echo $SOFT_DIR echo $MAVEN_DIR ----------------- $ sh test.sh /home/soft /home/soft/maven /home/soft /home/soft/maven
可是,若是你的脚本参数很是多,那使用上面的这种方式就很是不合适,你没法清楚地记得每一个位置对应的是什么参数。因此,咱们可使用bash
内置的getopts
,下面是一个简单的例子:shell
#!/bin/bash usage() { echo "Usage:" echo " test.sh [-j JAVA_DIR] [-m MAVEN_DIR]" echo "Description:" echo " JAVA_DIR, the path of java." echo " MAVEN_DIR, the path of maven." exit -1 } upload="false" while getopts 'h:j:m:u' OPT; do case $OPT in j) JAVA_DIR="$OPTARG";; m) MAVEN_DIR="$OPTARG";; u) upload="true";; h) usage;; ?) usage;; esac done echo $JAVA_DIR echo $MAVEN_DIR echo $upload --------------------------- $ sh test.sh -j /home/soft/java -m /home/soft/maven /home/soft/java /home/soft/maven false $ sh test.sh -j /home/soft/java -m /home/soft/maven -u /home/soft/java /home/soft/maven true $ sh test.sh -h test.sh: option requires an argument -- h Usage: test.sh [-j JAVA_DIR] [-m MAVEN_DIR] Description: JAVA_DIR, the path of java. MAVEN_DIR, the path of maven.
getopts
后面跟的字符串就是参数列表,每一个字母表明一个选项,若是字母后面跟一个:
就表示这个选项还会有一个值,好比上面例子中对应的-j /home/soft/java
和-m /home/soft/maven
。而getopts
字符串中没有跟随:
的字母就是开关型选项,不须要指定值,等同于true/false
,只要带上了这个参数就是true
。segmentfault
getopts
识别出各个选项以后,就能够配合case进行操做。操做中,有两个"常量",一个是OPTARG
,用来获取当前选项的值;另一个就是OPTIND
,表示当前选项在参数列表中的位移。case的最后一项是?
,用来识别非法的选项,进行相应的操做,咱们的脚本中输出了帮助信息。bash
当选项参数识别完成之后,咱们就能识别剩余的参数了,咱们可使用shift
进行位移,抹去选项参数。maven
#!/bin/bash usage() { echo "Usage:" echo " test.sh [-j JAVA_DIR] [-m MAVEN_DIR]" echo "Description:" echo " JAVA_DIR, the path of java." echo " MAVEN_DIR, the path of maven." exit -1 } upload="false" echo $OPTIND while getopts 'j:m:u' OPT; do case $OPT in j) JAVA_DIR="$OPTARG";; m) MAVEN_DIR="$OPTARG";; u) upload="true";; h) usage;; ?) usage;; esac done echo $OPTIND shift $(($OPTIND - 1)) echo $1 --------------- $ sh test.sh -j /home/soft/java -m /home/soft/maven otherargs 1 5 otherargs sh test.sh -j /home/soft/java -m /home/soft/maven -u otherargs 1 6 otherargs
在上面的脚本中,咱们位移的长度等于case循环结束后的OPTIND - 1
,OPTIND
的初始值为1,当选项参数处理结束后,其指向剩余参数的第一个。getopts
在处理参数时,处理带值的选项参数,OPTIND
加2;处理开关型变量时,OPTIND
则加1。工具
以上就是对getopts
的简单介绍。ui