天天看點

[Shell]指令行選項解析

1.概述

getopts從符合标準POSIX.2選項文法的參數清單中擷取選項及其參數(也就是,單個字母前面帶有 - ,可能後跟參數值;單個字母可以分組)。通常,shell腳本使用getopts來解析傳遞給它們的參數。 當在getopts指令行中指定參數時,getopts将解析這些參數,而不是解析腳本指令行。

Example:

sh test.sh -d 20170120 -p ios -k           

getopts就是從上述指令行中擷取選項d,p,k以及對應的參數 20170120,ios(如果有)。

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEB621acb230335b56786b61d035ec7e1ca%3Fmethod%3Ddownload%26read%3Dtrue#2-%E8%AF%AD%E6%B3%95 2. 文法

getopts optstring name [arg ...]           

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEB621acb230335b56786b61d035ec7e1ca%3Fmethod%3Ddownload%26read%3Dtrue#3-%E6%8F%8F%E8%BF%B0 3. 描述

optstring列出了需要識别腳本中的所有選項字母。 例如,如果需要識别腳本-a,-f和-s選項,則optstring為afs。如果希望識别選項字母以及後面的參數值或值組。例如,請識别腳本-d 20170120 -p ios,則 optstring為d:p:,在字母後面加一個冒号。 是以getopts期望的選項格式:

-o value           

通常,選項與參數之間有一個或多個空格,但是getopts也可以處理選項後面直接跟參數的情形,如:

-optvalue           

備注

optstring不能包含問号(?)字元。

getopts指令行上的名稱是shell變量的名稱。 每次調用getopts時,它都會從位置參數中擷取下一個選項,并将選項字母放在shell變量名稱中。

getopts在名稱中放置一個問号(?),如果它找到一個不出現在optstring中的選項,或者缺少一個選項值。

腳本指令行上的每個選項都有一個數字索引。初始索引為1, 找到的一個選項後索引加1,找到一個參數後索引加2,依此類推。 當getopts從腳本指令行擷取選項時,它将在shell變量OPTIND中存儲要處理的下一個參數的索引。

當一個選項字母有一個關聯的參數(在optstring中用a:表示)時,getopts将該參數作為一個字元串存儲在shell變量OPTARG中。 如果一個選項沒有參數,或getopts期望得到一個參數,但是沒有找到,getopts 重置 OPTARG。

當getopts到達選項的末尾時,退出,狀态值為1.它還設定名稱為字元? 并将OPTIND設定為選項後的第一個參數的索引。 getopts通過以下任何條件識别選項的結束:

  • 不是以 - 開頭的參數
  • 特殊參數 - ,标記選項的結束
  • 錯誤(例如,無法識别的選項字母)

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEB621acb230335b56786b61d035ec7e1ca%3Fmethod%3Ddownload%26read%3Dtrue#4-example 4. Example

#! /bin/bash
echo "init index "${OPTIND}
while getopts 'd:p:k' opt; 
do	
    case ${opt} in
        d)
            date="${OPTARG}";;
        p)
            platform="${OPTARG}";;
	k) 
	    haveKey="true";;
        ?)
            echo "Usage: `basename $0` [options] filename"
	    exit 1
    esac
    echo "opt is "${opt}", arg is "${OPTARG}", after index is "${OPTIND}    
done

echo "date is "${date}", platform is "${platform}", haveKey is "${haveKey}           

測試:

xiaosi@yoona:~$ sh test.sh -d 20170120 -p ios -k --
init index 1
opt is d, arg is 20170120, after index is 3
opt is p, arg is ios, after index is 5
opt is k, arg is , after index is 6
date is 20170120, platform is ios, haveKey is true           

原文:

https://www.mkssoftware.com/docs/man1/getopts.1.asp