2012-09-17 3 views
1

옵션을 구문 분석하기위한 쉘 스크립트를 작성하고 있습니다. 그것은 옵션을 올바르게 구문 분석하지만 입력 인수를 생략하면 while 루프에서 나오지 않습니다. 누구든지 도움을 줄 수 있습니까?Getopt in shell

TEMP=`getopt -o ha:b:d:e:c: --l ca: \-n "$x" -- "[email protected]"` 

eval set -- "$TEMP" 

while true; do 

    case "$1" in 

    -h)  print $USAGE 
      exit 0 ;; 
    -a)  case "$2" in 
       -*|"") error "Option t, requires argument"; 
         exit 1;; 

       *) print $2 
        T=${2^^} ; 
        shift 2 ;; 
      esac ;; 

    -b)  case "$2" in 
       -*|"") error "Option p, requires argument"; 
        exit 1 ;; 

       *) print $2 
        PE=${2^^} ; 
        shift 2 ; 
      esac ;; 

    -d)  case "$2" in 
       -*|"") error "Option f, requires argument"; 
         exit 1 ;; 

       *) print $2 ; 
        IN=$2 ; 
        shift 2 ;; 
      esac ;; 

    -e)  case "$2" in 
       ""|-*) error "Option e, requires argument"; 
         exit 1 ;; 

       *) print $2 ; 
        KEY=$2 ; 
        shift 2 ;; 
      esac ;; 
    -c|--ca) case "$2" in 
       ""|-*) error "Option c, requires argument"; 
        exit 1;; 

       *) print $2 ; 
        C=${2}; 
        shift 2 ;; 
      esac ;; 


    --)  shift ; 
      break ;; 

    *)  error "Invalid Input!" ; 
      exit 1 ;; 

    esac 
done 


USAGE:foo.sh -a arg1 -b arg2 -c arg3 -d arg 4 -e arg5 

이 잘 작동하지만

foo.sh -a arg1 -b arg2 -c arg3 

는 while 루프 밖으로되지 않습니다.

답변

0

루프를 종료하지 마십시오. 출구가 어떻게 될 것으로 예상합니까? 일반적인 배열은 상단에서 $#을 검사하고 zonzero 인 경우에만 진행하는 것입니다.

2

대신의 getopt을 사용하지만 내장 getopts, 루프 조건이 있어야한다 :

while [ $# -gt 0 ] 
do 
    case "$1" in 
    ... 
    esac 
done 

또한 변수 $TEMP 필요하지 않습니다; 당신은 단순히 다음을 사용할 수 있습니다 :

eval set -- $(getopt -o ha:b:d:e:c: --l ca: \-n "$x" -- "[email protected]") 

일반적으로 $(...) 표기법은 백 마크보다 바람직합니다.

+0

이것은 작동합니다. 하지만 모든 입력 인수는 arg1이 아닌 'arg1'형식을 갖습니다. 그것에 대한 어떤 해결책 ?? – user1558886

+0

사과 : 나는'set' 앞에서'eval'을 놓쳤습니다. 내가 그것을 포함하도록 답변을 업데이 트했습니다. –

+0

고맙습니다 ... – user1558886