혼합 매개변수를 스크립트에 전달하고 선택적 매개변수만 전달하는 방법

혼합 매개변수를 스크립트에 전달하고 선택적 매개변수만 전달하는 방법

나는 이 문제를 내가 해야 할 것보다 오랫동안 조사해왔고 getopts가 매우 혼란스러운 도구라는 것을 발견했습니다.

내가하고 싶은 일은 다음과 같습니다. $1 $2 $3 와 같은 인수를 전달할 수 있는 스크립트가 있으며 그 중 하나는 선택 사항입니다 -e email

내가 한 일은 다음과 같습니다. 물론 전혀 작동하지 않았습니다.

#!/bin/bash

    if [[ $# -lt 2 ]] || [[ $# -gt 3 ]]
    then
            echo
            echo "usage is `basename $0` argument1 argument2 {-e email}"
    exit 1
    fi

    while getopts e: flag; do
      case $flag in
        e)
          EMAIL=$OPTARG;
          ;;
        ?)
          exit;
          ;;
      esac
    done

    [[ -v $EMAIL ]] && echo "I am sending you $1 and $2!!" | mutt -s "present" $EMAIL && exit 0

    echo "I am keeping $1 and $2 to myself"

물론 이 getopts 비즈니스를 무시하고 사용하지 않을 수도 있습니다. 단지 올바르게 사용하는 방법을 배우고 싶을 뿐입니다.

답변1

여러 가지 질문이 있습니다:

  • 옵션을 처리하기 전에 매개변수 수를 테스트하고 있습니다. 옵션을 처리할 때까지 argv의 슬롯 수를 옵션이 차지하는지 알 수 없으므로 $#(제안한 대로) 2와 3 사이의 값이 필요한지 또는 다른 값이 필요한지 결정할 수 없습니다. 옵션의 존재를 예측하더라도 그것이 (argv 슬롯 1개 소모) 될지 (2 슬롯 소모) -e될지는 알 수 없습니다 . 옵션이 아닌 인수 2개를 정확히 받고 싶은 것 같으므로 해야 할 일은 정확히 2개와 같은지 확인하는 것입니다.-eemail-e email$#뒤쪽에옵션이 소모되었습니다.
  • [[ -v $EMAIL ]]이메일은 아무 의미가 없습니다. 이는 다음과 같은 여부를 테스트합니다.of는 $EMAIL원하는 것이 아닌 유효한 쉘 변수를 지정합니다. 이것이 바로 당신의 뜻입니다[ -n "$EMAIL" ]
  • getopts옵션은 사용되지 않으며 단지 구문 분석만 됩니다. 구문 분석한 후에는 를 사용하여 건너뛰어야 합니다 shift $(($OPTIND-1)).
  • 스크립트를 잘못 호출했습니다. 옵션은 매개변수 앞에 오므로 사용법은 입니다 $0 [-e email] argument1 argument2.

관련 정보