2014-04-19 1 views
0

getopt를 사용하여 나중에 명령 행 옵션을 실제로 구문 분석하지만, 옵션이있는 경우 일찍 일부 플래그를 사용 가능하게하려고합니다. 스크립트의 시작 부분에서 정규식으로 구문 분석하려고합니다.bash 옵션 문자열을 정규식으로 구문 분석

이것은 내가 지금 가지고있는 것이지만 작동하지 않습니다. 나는이 (가 확실하지 아마 무슨 이유를)하고 다른 사람의 예를 찾을 수 없습니다 :

# Enable extended pattern matching features. 
shopt -s extglob 

# Internal values & flag initialization. 
declare -A __ 
__[OPT]="[email protected]"      # the command line options 
__[PWD]=$(pwd)      # the current directory 
__[SRC]="$BASH_SOURCE"    # unresolved path to executable 
__[SRC_DIR]=$(dirname ${__[SRC]}) # parent directory of unresolved executable 
__[BIN]=$(readlink -f "$0")   # resolved path to executable 
__[BIN_DIR]=$(dirname ${__[BIN]}) # parent directory of resolved executable 

# Preparse option string to enable flags early. 
[[ ${__[OPT]} =~ (-d\b)|(--debug\b) ]] && __[DEBUG]=true || __[DEBUG]=false 
[[ ${__[OPT]} =~ (-v\b)|(--verbose\b) ]] && __[VERBOSE]=true || __[VERBOSE]=false 


for key in "${!__[@]}"; do 
    echo "$key: ${__[$key]}" 
done 

편집 : @ mklement0

에 의해 조언에 따라 솔루션 다음 작품은 예상대로 :

[[ ${__[OPT]} =~ $(echo '(-d\b)|(--debug\b)') ]] && __[DEBUG]=true || __[DEBUG]=false 
[[ ${__[OPT]} =~ $(echo '(-v\b)|(--verbose\b)') ]] && __[VERBOSE]=true || __[VERBOSE]=false 

답변

0

\b=~ 운영자가 단어 경계 마커로 인식되지 않습니다. 대신 공백을 사용하십시오 (공백은 ${__[OPT]}의 옵션을 구분할 것이므로).

+1

공간을 대신 사용하는 것은 좋은 조언이지만, _ = 불행히도'= ~'가'\ b'를 인식하는지 여부는 플랫폼에 달려 있습니다. 그림은 bash 4.x의 버그에 의해 regex _literals_와 관련하여 혼란 스럽습니다. 테스트를 위해 중간 변수를 사용하십시오 :'re = 'a \ b'; [[ 'a'= ~ $ re]] && echo YES'; 리눅스에서는 성공할 것이다. 반대로, OSX에서는 작동하지 않을 것입니다 ('re = 'a [[:> :]]'')를 써야합니다. – mklement0

+0

처음에는 공백을 사용하여 시도했지만 플래그가 옵션 문자열 끝에 있으면 (예 : "bish -d") 일치하지 않습니다. – nfarrar

+0

문제였던 bash 4.x 버그에 대한 정보를 가져 주셔서 감사합니다. – nfarrar

관련 문제