getopt - 다음 플래그를 인수로 읽는 것을 피하는 방법은 무엇입니까?

getopt - 다음 플래그를 인수로 읽는 것을 피하는 방법은 무엇입니까?

getopt를 사용하고 빈 인수를 통해 필수 플래그를 전달하면 다음 플래그를 인수로 읽습니다. 대시(-)와 이중(--)이 포함된 플래그를 구별하기 위해 일종의 검사를 추가하는 데 도움이 필요합니다. 그렇지 않으면 오류로 식별한 다음 Usage 함수를 호출합니다.

./test.sh -s -h

산출:

 -s '-h' --

DBSTORE=-h
DBHOST=

제가 작업 중인 코드는 다음과 같습니다.

#!/bin/bash

################################################
# Usage function display how to run the script #
################################################
function usage(){
    cat << EOF
    Usage: ./test.sh [-s] <abc|def|ghi> [-h] <Hostname>

    This script does foo.
    OPTIONS:
        -H | --help         Display help options
        -s | --store STORE  OpenDJ Store type [abc|def|ghi]
        -h | --Host  HOST   Hostname of the servers
EOF
}

##########################################
# Parse short/long options with 'getopt' #
##########################################
function getOpts(){
    # Option strings:
    SHORT=s:h:H
    LONG=store:,host:,help
    # Read the options
    OPTS=$(getopt --options $SHORT --long $LONG --name "$0" -- "$@")

    if [ $? != 0 ]; then
        echo "Failed to parse options...!" >&2
        usage
        echo ""
        exit 1
    fi
    echo "$OPTS"
    eval set -- "$OPTS"

    # Set initial values:
    DBSTORE=
    DBHOST=
    HELP=false

    # Extract options and their arguments into variables:
    NOARG="true"
    while true; do
        case "$1" in
            -s | --store )
                            DBSTORE=$2;
                            shift 2
                            ;;
            -h | --host )
                            DBHOST="$2"
                            shift 2
                            ;;
            -H | --help )
                            usage
                            echo ""
                            shift
                            shift
                            exit 1
                            ;;
            -- )
                    shift
                    break
                    ;;
            \?)
                echo -e "Invalid option: -$OPTARG\n" >&2
                usage;
                echo ""
                exit 1
                ;;
            :) 
                echo -e "Missing argument for -$OPTARG\n" >&2
                usage;
                echo ""
                exit 1
                ;;
            *) 
                echo -e "Unimplemented option: -$OPTARG\n" >&2
                usage;
                echo ""
                exit 1
                ;;
      esac
      NOARG="false"
    done
    [[ "$NOARG" == "true" ]] && { echo "No argument was passed...!"; usage; echo ""; exit 1; }
}

getOpts "${@}"

echo DBSTORE=$DBSTORE
echo DBHOST=$DBHOST

exit 0

관련 정보