2017-11-02 17 views
2

나는 아래의 bash 스크립트가 getopts을 사용하고있다. 내 코드가 예상대로 작동합니다. 즉, 잘못된 옵션이 지정되면 $ myopt 변수가 '?'로 설정됩니다. character와 case 문은 '?'와 일치하는 코드를 올바르게 처리합니다.
다른 곳에서 '\를 사용하여 비슷한 코드를 볼 수 있습니까?' 그냥 '대신에?' case 문에서 (코드 블록의 마지막 세 개의 주석 처리 된 행을 참조하십시오).'?'을 확인하는 올바른 방법은 무엇입니까? case 문에서

왜 '?' 도망 간다? 어떤 charcter도 '\'를 사용하여 이스케이프 처리 될 수 있다는 것을 알고 있지만 내 코드는 '?'를 이스케이프 처리하지 않고 완벽하게 작동합니다.

#!/bin/bash 
while getopts ":abc" myopt; do 
    case $myopt in 
     [a-c]) 
     echo "$myopt is a valid option!" >&2 
     ;; 
     ?) 
     echo "$OPTARG is an invalid option!" >&2 
     ;; 
    # \?) 
    # echo "$OPTARG is an invalid option!" >&2 
    # ;; 
    esac 
done 

다른 읽기 기능을 활용하려면 아래 코드가 '?'인 경우에만 작동합니다. 이스케이프 처리됩니다 (좋은 설명을 보려면 답변을 참조하십시오).

#!/bin/bash 
while getopts ":abc" myopt; do 
    case $myopt in 
     \?) 
     echo "$OPTARG is an invalid option!" >&2 
     ;; 

    [a-c]) 
     echo "$myopt is a valid option!" >&2 
     ;; 
    esac 
done 

스크립트 파일이 myscript.sh 인 경우는 다음과 같이 테스트 할 수 있습니다 - 배쉬 case 선언문 ?를 들어

./myscript.sh -a -z -a 
+1

또 다른 이유 : 옵션 중 하나에 인수가 필요하다고 가정하면 'getopts': abcd : "myopt"입니다. 사용자가 인수를 제공하지 못하면, myopt는':'를 포함하고'?)'브랜치에 의해 넘어 가서 오해 될 수있는 오류 메시지를 보냅니다. –

답변

7

는 단일 문자/숫자 일치하는 와일드 카드입니다. \?으로 탈출하면 구체적으로 '?' char와 일치하려고합니다.

case은 일치 항목을 계속 찾습니다. 따라서이 경우 변수가 [a-c] (a, b 또는 c)이 아닌 경우 변수가 1 char 인 경우 일치합니다.

+0

나는 지금 이해했다. 위의 코드는 '?'에 대한 패턴 일치 때문에 작동합니다. case 문에서 마지막으로 수행됩니다. 이 특정 경우에 코드는 '?' 탈출했는지 여부. 패턴이 '?'와 일치하면 case 문에서 첫 번째 테스트이므로 이스케이프해야합니다. '\'를 사용하여 이스케이프하지 않으면 myopt 변수의 모든 단일 문자 값이 bash 와일드 카드 '?'와 일치합니다. –

+1

예. 유효하지 않은 OPTARG를 확인하려면'\? '를 사용하는 것이 가장 좋습니다. 만일 하나의 문자가 통과 되었다면''? ''이 아닌''단지'? '로 무효 처리 될 것입니다. – MrJLP