util-linux의 getopt는 첫 번째 매개변수를 무시합니다.

util-linux의 getopt는 첫 번째 매개변수를 무시합니다.

명령줄 인수를 구문 분석하기 위해 stackexchange 웹 사이트의 게시물을 따랐습니다. 내 프로그램은 긴 매개변수만 구문 분석하며 모든 매개변수는 필수입니다. 내가 한 일은 다음과 같습니다.

getopt --test > /dev/null
if [[ $? -ne 4 ]]; then
    echo "getopt --test failed in this environment."
    exit 1
fi

function quit {
    echo "$1"
    exit 1
}

# Option strings
LONG="producer-dir:,consumer-dir:,username:,password:,url:,kafka-host:,checkpoint-dir:"

# read the options
OPTS=$(getopt --longoptions ${LONG} --name "$0" -- "$@")
if [ $? != 0 ]; then 
    quit "Failed to parse options...exiting."
fi

eval set -- "$OPTS"

# extract options and their arguments into variables.
while true ; do
  case "$1" in
    --producer-dir )
      PRODUCER_DIR="$2"
      shift 2
      ;;
    --consumer-dir )
      CONSUMER_DIR="$2"
      shift 2
      ;;
    --username )
      USERNAME="$2"
      shift 2
      ;;
    --password )
      PASSWORD="$2"
      shift 2
      ;;
    --url )
      URL="$2"
      shift 2
      ;;
    --kafka-host )
      KAFKA_HOST="$2"
      shift 2
      ;;
    --checkpoint-dir )
      CHECKPOINT_DIR="$2"
      shift 2
      ;;
    -- )
      shift
      break
      ;;
    *)
      echo "Internal error!"
      exit 1
      ;;
  esac
done

매개변수를 어떤 순서로 전달하든 첫 번째 매개변수는 무시되고 결과는 비어 있습니다. 나머지 매개변수는 예상대로 구문 분석됩니다. 내가 무엇을 놓치고 있나요?

답변1

제 생각에는 첫 번째 인수로 의도한 내용이 해석되고 있는 것 같습니다 getopt. optstring매뉴얼 페이지 시작 부분에 getopt세 가지 개요가 나열되어 있습니다 . 두 번째 것을 사용하는 것 같습니다.

`getopt [options] [--] optstring parameters`

첫 번째 항목 이후에는 --가 아니지만 이라는 parameters점 에 유의하세요 optstring.

getopt이 주제에 대해 이야기하는 동안 bash에는 trailing bash getopts의 내부 버전이 있다는 점을 언급해야 합니다 s. 다른 모든 것이 동일하다면 bash의 내부 기능을 사용하는 것이 더 효율적이어야 합니다.

관련 정보