私は非常に単純なbashスクリプトを使用していますが、解決できない問題に直面しました。
、、、のmyscript.sh
3つのパラメータがあります。どちらも必須で、スクリプトを実行する必要があります。-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
が変数に割り当てられるか、変数に割り当てられているかをテストする短い文です。これらの変数のいずれかが空の場合、コードはそれをエラーとして処理し、単純な診断メッセージを印刷して終了します。user
while
/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
様シェルでサポートされています。