Bash getopts, 필수 매개변수

Bash getopts, 필수 매개변수

저는 매우 간단한 bash 스크립트를 사용하고 있지만 해결할 수 없는 문제에 직면했습니다.

, , 의 myscript.sh세 가지 매개변수 가 있습니다 . 둘 다 필수이며 스크립트를 실행해야 합니다.-u-h-p-u-h

내가 하고 싶은 것은 myscript.sh -u User1그것이 전부라면 exit 1.

myscript.sh -u User1 -h Localhost옵션이 제공 되면 스크립트를 구문 분석하고 실행하고 , 그렇지 않으면 종료해야 합니다.

매우 감사합니다

답변1

어쩌면 이런 게 있지 않을까요?

#!/bin/bash

unset -v host
unset -v port
unset -v user

while getopts h:p:u: opt; do
        case $opt in
                h) host=$OPTARG ;;
                p) port=$OPTARG ;;
                u) user=$OPTARG ;;
                *)
                        echo 'Error in command line parsing' >&2
                        exit 1
        esac
done

shift "$(( OPTIND - 1 ))"

if [ -z "$host" ] || [ -z "$user" ]; then
        echo 'Missing -h or -u' >&2
        exit 1
fi

# The rest of the script continues here and may make use of
# "$host" and "$user", and possibly "$port".

여기서 주요 부분은 if루프의 어떤 항목이 host또는 변수에 할당되었는지 테스트하는 짧은 문입니다. 이러한 변수 중 하나라도 비어 있으면 코드는 이를 오류로 처리하고 간단한 진단 메시지를 인쇄한 후 종료됩니다.userwhile

/bin/sh위에 표시된 스크립트에는 bashishm이 포함되어 있지 않으므로 실행할 수도 있습니다 .

문 외에도 if다음을 사용할 수 있습니다.

: ${host:?Missing -h}
: ${user:?Missing -u}

아니면 더 짧게,

: ${host:?Missing -h} ${user:?Missing -u}

:명령은 아무 작업도 수행하지 않는 유틸리티이지만 해당 인수는 모든 명령과 마찬가지로 호출 셸에서 계속 처리됩니다. 위의 두 줄에 대해 쉘은 변수 확장을 시도하며 host, user변수가 설정되지 않거나 확장 결과 빈 문자열이 발생하는 경우 오른쪽에 다음 문자열이 출력되고 ?스크립트는 다음과 같이 종료됩니다. 0이 아닌 상태:

$ bash script.sh -h somehost
script.sh: line 21: user: Missing -u
$ echo $?
1

${variable:?text}확장은 표준이므로 bash다른 모든 POSIX sh유사 셸에서 지원됩니다.

관련 정보