bash의 케이스 구조에서 * 및 -*

bash의 케이스 구조에서 * 및 -*
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아무것도 출력으로 얻지 못한다 는 사실은 -*가 gnor 와 일치할 수 없음을 의미합니다 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에서는 일치할 수 없고 gdocase2 에서는 일치할 수 있습니까 gg?-*

답변1

그러나 그것은 일치하도록 요구되는 것이 아닙니다. 문제는 그 문제와 관련이 없으며 그 문제 와 관련된 case모든 것입니다 .getoptset

비록 당신의사례블록은 여전히 ​​동일한 것을 확인하므로 $1더 이상 거기에서 명령줄 매개변수만 가져오지 않습니다. 이전 set명령교체됨원래 매개변수와 출력getopt일반적으로 다음과 같은 프로그램입니다 -- "g".

해당 추가 --매개변수는 다음에 의해 삽입됩니다.getopt옵션이 이 시점에서 중지되고 옵션이 아닌 인수가 시작됨을 나타냅니다. 그게 전부의 목적이야getopt어쨌든 – 다양한 종류의 명령줄 인수를 정렬하고 분리합니다.

다음 줄을 추가하면 다음과 같이 명확해집니다.

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

관련 정보