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

ベストアンサー1

おすすめ記事