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


0
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 gdocase1 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 일치하지 수 ggg, -*docase2 수에서?

답변:


2

그러나 그것은 일치하도록 요구되는 것이 아닙니다. 문제는 case그와 관련이 getopt있고 그 set이전 과 관련이 없습니다 .

귀하의 사례 블록이 여전히 똑같은 $1것을 확인 하더라도 더 이상 명령 줄 매개 변수를 얻지 못합니다. 이전 set명령 은 원래 매개 변수를 getopt 프로그램 의 출력으로 대체 했으며 일반적으로 다음과 같습니다 .-- "g"

이 추가 --매개 변수는 getopt 에 의해 삽입되어 옵션이이 시점에서 중지되고 옵션이 아닌 인수가 시작됨을 나타냅니다. 어쨌든 getopt 의 전체 목적은 다른 종류의 명령 줄 인수를 정렬하고 분리하는 것입니다.

이 줄을 추가하면 분명해집니다.

 while true; do
+    echo "arg 1 is '$1'"
     case "$1" in
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.