shell命令行參數解析工具:getopts

shell命令行參數解析工具:getopts

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,只要帶上了這個參數就是truesegmentfault

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 - 1OPTIND的初始值爲1,當選項參數處理結束後,其指向剩餘參數的第一個。getopts在處理參數時,處理帶值的選項參數,OPTIND加2;處理開關型變量時,OPTIND則加1。工具

以上就是對getopts的簡單介紹。ui

原文連接

https://segmentfault.com/a/11...命令行

相關文章
相關標籤/搜索