Bash getopts、必須パラメータ

Bash getopts、必須パラメータ

私は非常に単純なbashスクリプトを使用していますが、解決できない問題に直面しました。

、、、のmyscript.sh3つのパラメータがあります。どちらも必須で、スクリプトを実行する必要があります。-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}

この:コマンドは何もしないユーティリティですが、その引数はすべてのコマンドと同様に呼び出しシェルで処理され続けます。上記の2行に対して、シェルは変数の拡張を試み、host変数userが設定されていない場合、または拡張結果の空の文字列が発生した場合、右側に次の文字列が出力され、?スクリプトは次のように終了します。 0以外の状態:

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

この${variable:?text}拡張は標準なので、bash他のすべてのPOSIXsh様シェルでサポートされています。

関連情報