在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