Linux shell命令行可選參數的getopts命令使用例子

Linux shell命令行可選參數的getopts命令使用例子

一、概述

getopts [option[:]] [DESCPRITION] VARIABLE
option:表示爲某個腳本可以使用的選項
":" 冒號如果某個選項(option)後面出現了冒號(":"),則表示這個選項後面可以接參數(即一段描述信息DESCPRITION)
VARIABLE:表示將某個選項保存在變量VARIABLE中

getopts是linux系統中的一個內置變量,一般用在循環中。每當執行循環時,getopts都會檢查下一個命令選項,如果這些選項出現
在option中,則表示是合法選項,否則不是合法選項。並將這些合法選項保存在VARIABLE這個變量中。
getopts還包含兩個內置變量,及OPTARG和OPTIND
OPTARG 就是將選項後面的參數(或者描述信息DESCPRITION)保存在此變量當中。
OPTIND 這個表示命令行的下一個選項或參數的索引(文件名不算選項或參數)

while getopts ":a:bc:" opt
第一個冒號表示忽略錯誤;字符後面的冒號表示該選項必須有自己的參數。
$OPTARG 存儲相應選項的參數,如下例中的11、5;
$OPTIND 總是存儲原始$*中下一個要處理的選項(不是參數,而是選項,此處指的是a,b,c這三個選項,而不是那些數字,當然數字
也是會佔有位置的)位置。
optind初值爲1,遇到"x",選項不帶參數,optind+=1;遇到"x:",帶參數的選項,optarg=argv[optind+1],optind+=2;

二、shell的getopts命令舉例

$ vim getopts.sh

#!/bin/bash
echo $*
a_value='-1'
b_value='-1'
c_value='-1'
para_num=$#
usage() {
    echo -e "Usage:\n  $0 -a 'username' [-b '0.2'] [-c 0]" 1>&2
    exit 1
}
if [[ ${para_num} -lt 1 ]]; then
    echo "參數個數不夠,請按照如下格式傳入參數"
    usage
    exit 1
fi
while getopts ":a:b:c:" opt
do
    case $opt in
        a)
        a_value=$OPTARG
        echo "a_value: ${a_value}"
        echo $OPTARG $OPTIND;;
        b)
        b_value=$OPTARG
        echo "b_value: ${b_value}"
        echo "b $OPTIND";;
        c)
        c_value=$OPTARG
        echo "c_value: ${c_value}"
        echo "c $OPTIND";;
        ?)
        error_value=$OPTARG
        echo "error_value: ${error_value}"
        usage;;
    esac
done
echo "***********"
echo "a_value: ${a_value}"
echo "b_value: ${b_value}"
echo "c_value: ${c_value}"

1、執行:$ bash ./getopts.sh -a a11 -b b55  -c cc66
結果:

-a a11 -b b55 -c cc66
a_value: a11
a11 3
b_value: b55
b 5
c_value: cc66
c 7
***********
a_value: a11
b_value: b55
c_value: cc66

解釋:
第一行輸出echo $*
第三行,optind初值爲1,選項-a的參數爲a11,下一個要處理的選項-b位置爲3(即OPTIND=3),所以輸出:a11 3;
第五行,然後-b要處理的下一個選項-c位置爲5,所以輸出:b 5;
第七行,再者-c有參數,所以下一個要處理的位置+2(即爲7,照着所有參數也數的出來下一個參數即爲7,因爲如果有下一個參數那麼一定是在參數值5之後的),所以輸出:c 7;
其中,第二行、第四行、第六行是具體參數的值
注:選項參數的格式必須是 -d val,而不能是中間沒有空格的-dval  【如-d 10 不能是-d10】
    getopts是對腳本參數的校驗

2、執行:$ bash ./getopts.sh  -a a11 -b b55 

結果爲:

 -a a11 -b b55
a_value: a11
a11 3
b_value: b55
b 5
***********
a_value: a11
b_value: b55
c_value: -1

3、執行:$ bash ./getopts.sh -a a11 

-a a11
a_value: a11
a11 3
***********
a_value: a11
b_value: -1
c_value: -1

4、執行:$ bash ./getopts.sh

參數個數不夠,請按照如下格式傳入參數
Usage:
  ./getopts.sh -a 'username' [-b '0.2'] [-c 0]

5、執行:$ bash ./getopts.sh -a a11 -b b55  -c cc66 -dvv

-a a11 -b b55 -c cc66 -dvv
a_value: a11
a11 3
b_value: b55
b 5
c_value: cc66
c 7
error_value: d
Usage:
  ./getopts.sh -a 'username' [-b '0.2'] [-c 0]

6、執行:$ bash ./getopts.sh -a a11 -dvv -b b55

-a a11 -dvv -b b55
a_value: a11
a11 3
error_value: d
Usage:
  ./getopts.sh -a 'username' [-b '0.2'] [-c 0]

參考: https://www.jianshu.com/p/baf6e5b7e70a

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章