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
공간을 대신 사용하는 것은 좋은 조언이지만, _ = 불행히도'= ~'가'\ b'를 인식하는지 여부는 플랫폼에 달려 있습니다. 그림은 bash 4.x의 버그에 의해 regex _literals_와 관련하여 혼란 스럽습니다. 테스트를 위해 중간 변수를 사용하십시오 :'re = 'a \ b'; [[ 'a'= ~ $ re]] && echo YES'; 리눅스에서는 성공할 것이다. 반대로, OSX에서는 작동하지 않을 것입니다 ('re = 'a [[:> :]]'')를 써야합니다. – mklement0
처음에는 공백을 사용하여 시도했지만 플래그가 옵션 문자열 끝에 있으면 (예 : "bish -d") 일치하지 않습니다. – nfarrar
문제였던 bash 4.x 버그에 대한 정보를 가져 주셔서 감사합니다. – nfarrar