bash 的 case 結構中的 * 和 -*

bash 的 case 結構中的 * 和 -*
docase1(){         
    case "$1" in             
        -a )                  
            echo "case a" ;;                
        -b )                    
            echo "case b" ;;                 
        -* )                 
            echo "wrong input" ;;                 
    esac
} 

-*我們可以得到可以匹配-+字元而不是字元的結論。

docase1  -g
wrong input
docase1  -gg
wrong input
docase1  g
docase1  gg

docase1 g命令和沒有得到任何輸出的事實docase1 gg意味著 -* 既不能匹配 也不能g匹配gg

docase2(){     
    OPTS=$(getopt -o ab    -- "$@");
    if [ $? != 0 ] ; then           
       echo  "wrong" ;     
    fi;     
    eval set -- "$OPTS"; 
    while true; do         
        case "$1" in             
            -a )                  
                echo "case a" ;                 
                shift ;;             
            -b )                    
                echo "case b";                 
                shift ;;             
            -* )                 
                echo "wrong input";                 
                break;;         
        esac    
done
} 

為什麼-*在 docase2 中可以匹配字元?

docase2  g
wrong input
docase2  gg
wrong input

為什麼相同的表達-*會產生不同的效果?
-*在 docase1 中不能匹配g,在 docase2 中可以嗎gg-*

答案1

但這並不是要求配對的內容。這個問題與它之前的case一切都無關。getoptset

即使你的案件block 仍然檢查相同的內容$1,它不再只是從那裡獲取命令列參數。之前的set命令被取代原始參數與輸出獲取選擇程序,通常看起來像-- "g".

此額外--參數是透過插入的獲取選擇指示選項在此停止,非選項參數開始。這就是整個目的獲取選擇無論如何 - 對不同類型的命令列參數進行排序和分離。

如果添加這一行,它應該變得顯而易見:

 while true; do
+    echo "arg 1 is '$1'"
     case "$1" in

相關內容