Linux shell getopts 學習

獲取UNIX類型的選項:linux

  unix有一個優勢就是標準UNIX命令在執行時都具備相同的命令行格式:shell

  command -options parametersbash

  若是在執行Shell程序也採用上述格式,Bourne Shell中提供了一條獲取和處理命令行選項的語句,即getopts語句。該語句的格式爲:ide

  getopts option_string varname函數

  其中option_string中包含一個有效的單字符選項。若getopts命令在命令行中發現了連字符,那麼它將用連字符後面的字符同 option_string相比較。如有匹配,則把變量varname的值設爲該選項。若無匹配,則variable設爲?。當getopts發現連字符後面沒有字符,會返回一個非零的狀態值。Shell程序中能夠利用getopts的返回值創建一個循環。測試

  有時侯選項中還帶一個值,getopts命令一樣也支持這一功能。這時須要在option_string中選項字母后加一個冒號。當 getopts命令發現冒號後,會從命令行該選項後讀取該值。若該值存在,那麼將被存在一個特殊的變量OPTARG中。若是該值不存在,getopts命令將在OPTARG中存放一個問號,而且在標準錯誤輸出上顯示一條消息。spa

  optstring  option  字符串,會逐個匹配命令行

  varname     每次匹配成功的選項unix

  arg             參數列表,沒寫時它會取命令行參數列表字符串

  $OPTIND     特殊變量,option index,會逐個遞增初始值爲1

  $OPTARG    特殊變量,option argument,不一樣狀況下有不一樣的值

 

細則1
optstring以":"開頭時,getopts會區分invalid option錯誤和miss option argument invalid option錯誤時,varname會被設成?,$OPTARG是出問題的optionmiss option argument,varname會被設成:(在個人fedora系統裏測試OPTARG?),$OPTARG是出問題的option.


optstring不以":"開頭,invalid option錯誤和miss option argument錯誤都會使varname被設成?, $OPTARG是出問題的option(在個人fedora系統裏測試OPTARG爲空).

細則2
optstring中的字母跟」:「,代表該option可接參數,參數(argument)放在$OPTARG,若是缺參數,optstring是以」:「開頭,varname的值會是:(在個人fedora系統裏測試OPTARG?),$OPTARG是該option, 不然varname的值是?,$OPTARG是該option.(參照細則1)(在個人fedora系統裏測試OPTARG爲空) 

 

#!/bin/bash

if [[ $# -lt 1 ]];then 
    echo "USAGE:`basename $0` [-a] [-b value] [-c]" 
    exit 1 
fi  

while getopts :ab:c name 
do 
    case $name in 
         a)  aflag=1 
              echo "a" 
              ;; 
         b)  bflag=1 
             if [[ ${OPTARG:0:1} = "-" ]]; then 
                echo "invalid parameter of $OPTARG" 
                exit 1 
             fi 
             bval=$OPTARG 
             ;; 
          c)  cflag=1 
              echo "c" 
              ;; 
         \?) echo "Invalid option :`basename $0` [-a] [-b value] [-c]" 
             exit 1 
             ;; 
         :) echo "$0:Must supply an argument to -$OPTARG." 
            exit 1 
           ;; 
     esac

done

echo $bval

在getopts分析選項時,若是-b後面不帶參數,直接跟-c的話,那麼-c將做爲-b的參數。

下面是一個簡單例子(腳本爲getopt):


#/bin/bash

echo $0
echo $*

while getopts ":a:bc" opt
do
        case $opt in
                a )
                        echo $OPTARG                   
                        echo $OPTIND;;
                b )
                        echo "b $OPTIND";;
                c )
                        echo "c $OPTIND";;
                ? )
                        echo "error"                   
                        exit 1;;
        esac

done

echo $OPTIND
echo $*

shift $(($OPTIND - 1))

echo $*
echo $0

 

運行sh getopt.sh  -a 12 -b -c 34 -m
輸出:

getopt.sh
-a 12 -b -c 34
12
3
b 4
c 5
5
-a 12 -b -c 34
34
getopt.sh

 

能夠得出一些結論: 

1$0在用sh 或者 ./執行腳本時,指的是腳本名,用source.執行時,永運是bash,這也反應了sh 或者 ./執行腳本的原理和source的方式是不一樣的.

2$1 (1....n)指的第一個參數到....n個參數

3OPTARG存儲相應選項的參數 OPTIND指向的是下一個參數的index

4shift 會改變參數的順序,經過左移去掉某些參數

5getopts檢測到非法參數就會中止,好比上例中遇到34就會終止,並不會去檢測-m了,也就是說只要前一個參數是合法的(包含在option_string中的),就會繼續檢測下一個參數。

另外: unset OPTIND  能夠解決shell腳本的函數中使用getopts  

相關文章
相關標籤/搜索