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 ではand は
-*一致できませんが、docase2 では一致できますか?ggg-*

答え1

しかし、それは一致を求められているものではありません。問題はそれとはまったく関係がなく、それ以前のcaseすべてです。getoptset

あなたの場合ブロックは依然として同じをチェックします$1が、そこからコマンドラインパラメータだけを取得することはもうありません。以前のsetコマンド交換された元のパラメータと出力を取得プログラムは、一般的に次のようになります-- "g"

その追加--パラメータは、取得この時点でオプションが終了し、オプション以外の引数が始まることを示すためです。これが取得とにかく、さまざまな種類のコマンドライン引数を分類して分離します。

この行を追加すると、次のことが明確になります。

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

関連情報