매개변수 항목 순서가 있는 셸이 문제입니다.

매개변수 항목 순서가 있는 셸이 문제입니다.
     while (("$#"))
do
opt="$1";
    shift;
        case "$opt" in
           "-c" | "--create") create_flag=1 ;;
           "-up" | "--update") update_flag=1 ;;
           "-q" | "--query")  query_flag=1 ;;
           "-csr"| "--createabc") createsr_flag=1 ;; 
           "-g" | "--getconf") getconfig_flag=1 ;;
           "-catt" | "--createandattach") createattach_flag=1 ;;
           "-att" | "--attach") attach_flag=1 ;;
           "--val1" ) callerId="$1" ;;
           "--val2" ) title="$1" ;;
           "--val3" ) urgency="$1" ;;
           "--val4" ) environment="$1" ;;
           "--val5" ) failType="$1" ;;
           "--val6" ) jobName="$1" ;;
           "--val7" ) jobType="$1" ;;
              # usage();;
              # "*" )
              # OPTIONAL="${opt#*=}";;             #take argument
              # *) echo >&2 "Invalid option: $@"; exit 1;;
            esac

            shift 
    done     

달리기

 script.sh -c --val1 123456  

작동하지 않습니다!

  script.sh --val1 123456  -c 

이것은 작동합니다!

이유를 설명해 주실 수 있나요?

답변1

shift반복 당 무조건 두 번 호출됩니다 . 이는 --valN경우에 바람직하지만 다음 인수를 사용하지 않는 옵션에는 바람직하지 않습니다. 중복을 줄이기 위해 일반적인 경우를 취하고 그 안에 중첩할 수 있습니다.

case "$opt" in
    "-c" | "--create") create_flag=1 ;;
    "--val?" )
        case "$opt" in
            "--val1" ) callerId="$1" ;;
        esac
        shift
        ;;
esac

또는 shift다음과 같은 인수를 취하는 모든 옵션에 뿌리십시오.

case "$opt" in
    "-c" | "--create") create_flag=1 ;;
    "--val1" ) callerId="$1" ; shift ;;
esac

당신은 또한 찾을 수 있습니다getoptsBash에서 옵션을 구문 분석하는 데 유용합니다.

답변2

옵션이 인수를 취하지 않는 경우에도 while 루프는 무조건 두 번 이동하기 때문입니다. 두 번째 명령줄의 순서는 단지 운이 좋았을 뿐입니다.

관련 정보