2017-10-04 1 views
0

getopt를 사용하여 다음 명령 행 옵션을 구문 분석하는 방법을 알려줄 수 있습니까?bash 구문 분석 명령 행 옵션

myCmd [[-f <file> | -k | -v] -e <env> -h help] 

여기서

f, kv는 상호 배타적이다. fe 모두 매개 변수가 필요하지만 kv은 매개 변수가 필요하지 않습니다.

그래서 명령은 다음과 같습니다

  • 이 -f 파일 -e의 AAA 또는
  • 을 mycmd
  • mycmd -v -e AAA 또는
  • mycmd -k -e AAA

I 다음을 시도 :

while getopts "f:kve:" o 
    do 
    case "$o" in 
     f | k | v) process_file ;; 
     k) process_key ;; 
     v) process_var ;; 
     e) process_env ;; 
     *) print_help ;; 
    esac 
done; 

오크. 어떤 도움을 주셔서 감사합니다.

+0

"* 작동하지 않습니다 *"는 무엇을 의미합니까? 어떤 행동을 기대합니까? – Socowi

+0

f, k 또는 v를 상호 배제 할 수 없습니다. – Chenulu

답변

1

직접 논리를 추가해야합니다. 이것은 테스트되지 않았습니다 :

file="" 
has_k=false 
has_v=false 
env="" 

while getopts "f:kve:" opt; do 
    case "$opt" in 
     f) file="$OPTARG" ;; 
     k) has_k=true ;; 
     v) has_v=true ;; 
     e) env="$OPTARG" ;; 
     *) print_help; exit 1 ;; 
    esac 
done 
shift $((OPTIND - 1)) 

if ([[ -n $file ]] && $has_k) || 
    ([[ -n $file ]] && $has_v) || 
    ($has_k && $has_v) 
then 
    echo "May only specify one of -f,-k,-v" 
    print_help 
    exit 1 
fi 
관련 문제