2017-07-08 88 views
0

bash getopts應允許選項和參數不取決於位置,如tutorialsdocs中所述。bash getopts忽略選項,除非以某種方式指定

下面的代碼片段可以接收兩個選項:

這需要一個參數
  • -f選項不帶參數
    • 調試-d選項。

    我看到奇怪的行爲,只有列出的第一個選項得到正確處理。

    #!/bin/bash 
    
    ## Defaults 
    DEBUG=INFO 
    forceOption=FALSE 
    
    ## Usage 
    printUsage() { 
        echo " "  
        echo "USAGE: $0 [-d <DEBUG_LEVEL>] [ -f ]" 
        echo " "  
        exit 1 
    } 
    
    # 
    ## Manage options before start 
    # 
    
    while getopts "hfd:" OPT 
    do 
        case $OPT in 
         h) printUsage ;; 
         f) forceOption="TRUE" ;; 
         d) debugLevel="$OPTARG" ;; 
         *) printUsage ;;  
        esac 
        shift `expr $OPTIND - 1` 
    done 
    
    if [ -n "$debugLevel" ] ; then 
        DEBUG="$debugLevel" 
    fi 
    
    echo "DEBUG : $DEBUG" 
    echo "Force : $forceOption" 
    

    你可以看到下面的錯誤行爲:

    [rgulia$ ~] ./getopts.sh -d WARNING -f 
    DEBUG : WARNING 
    Force : FALSE 
    [rgulia$ ~] ./getopts.sh -f -d WARNING 
    DEBUG : INFO 
    Force : TRUE 
    

    代碼正確分析時的選項都單獨使用或者-f在選擇和他們的名單之前-d相互連接

    [rgulia$ ~] ./getopts.sh -f 
    DEBUG : INFO 
    Force : TRUE 
    [rgulia$ ~] ./getopts.sh -d WARNING 
    DEBUG : WARNING 
    Force : FALSE 
    [rgulia$ ~] ./getopts.sh -fd WARNING 
    DEBUG : WARNING 
    Force : TRUE 
    

    我的印象是循環太早退出b因爲它在選項傳遞參數時無法正確計算OPTIND。

    我用printf語句對OPT,OPTARG和OPTIND的值做了一些跟蹤,證實了這樣的理論,但我仍然不明白爲什麼會發生,以及如何解決它。

    有什麼建議嗎?

  • 回答

    1

    將移位移出循環。 OPTIND是原始arg向量的絕對索引。在循環後執行一次移位

    +0

    你是對的!有用。我想我一直誤解了OPTIND的含義。所以,getopts會跟蹤循環中讀取的選項和參數,而OPTIND的遞減只是讓該shell知道一旦-d和-f被處理後,arg向量中剩下多少個參數,對吧? – rgulia

    +0

    是的。 個人我已經停止使用getopts風格的參數。 它被設計成簡潔(在「複製」時間過長的時候,因此「cp」),並且當大多數其他主要操作系統(MSDOS,VMS,RSTS)使用 'command/option = value ...「 #但是Unix在路徑名中使用了「/」,所以它切換到'-o value'。對於'option = value'形式的字符串掃描args []非常容易(在腳本和程序中)使用環境中設置的參數默認值。My 2c – Mischa

    +0

    非常感謝您的解釋! – rgulia

    相關問題