スクリプトの実行中にユーザーが必須情報を見逃した場合に備えて、使用法コマンドを表示する必要があるスクリプトがあります。
Usage : Script -s <server> -i <instance> -u <user> -p <password> <query> -w <warning value> -c <critical value>
すべてのOPTIONS
についての説明付き
以下の変数のように引数から値を取得しています。しかし、シェルスクリプトでの検証でこの使用法が必要です。
SERVER=$1
INSTANCE=$2
USER=$3
DB_PASSWD=$4
QUERY=$5
VAL_WARN=$6
VAL_CRIT=$7
Getoptsを使用しようとしましたが、値を渡す前に<query>
に-q
パラメーターがないため、使用できませんでした。
私は他のすべての方法を見つけようとしましたが、誰もが私にとって実行可能な解決策ではないgetoptsを提案しました。
これについて私を助けてください。
次のように、shiftを使用してすべての引数を繰り返し処理します。
#!/bin/sh
usage ()
{
echo 'Usage : Script -s <server> -i <instance> -u <user> -p <password>'
echo ' <query> -w <warning value> -c <critical value>'
exit
}
if [ "$#" -ne 13 ]
then
usage
fi
while [ "$1" != "" ]; do
case $1 in
-s ) shift
SERVER=$1
;;
-i ) shift
INSTANCE=$1
;;
-u ) shift
USER=$1
;;
-p ) shift
PASSWORD=$1
;;
-w ) shift
WARNINGVAL=$1
;;
-c ) shift
CRITICVAL=$1
;;
* ) QUERY=$1
esac
shift
done
# extra validation suggested by @technosaurus
if [ "$SERVER" = "" ]
then
usage
fi
if [ "$INSTANCE" = "" ]
then
usage
fi
if [ "$USER" = "" ]
then
usage
fi
if [ "$PASSWORD" = "" ]
then
usage
fi
if [ "$QUERY" = "" ]
then
usage
fi
if [ "$WARNINGVAL" = "" ]
then
usage
fi
if [ "$CRITICVAL" = "" ]
then
usage
fi
echo "ALL IS WELL. SERVER=$SERVER,INSTANCE=$INSTANCE,USER=$USER,PASSWORD=$PASSWORD,QUERY=$QUERY,WARNING=$WARNINGVAL,CRITIC=$CRITICVAL"
トリックを行う必要があります。
EDIT: @technosaurusによって提案されたように、スクリプトに引数の検証を追加しました
これを試してみてください
usage()
{
echo "$0 -s <server> -i <instance> -u <user> -p <password> <query> -w <warning value> -c <critical value>"
}
for i in {0..12}
do
arg=`expr $i +1`
test ! "${!arg}" && usage && break
done
お役に立てれば
getopts
は 正当な理由 のために愚痴をこぼしています。スクリプトのインターフェイスを変更して、人々が期待するものに準拠させる必要があります。
または、getopts
を2回使用することもできます。最初はquery
より前のオプション、shift
、次に残りのオプションに使用します。
これは非標準的なアプローチですが、私が非常に役立つと思うアプローチです。特定のフラグに引数として値を渡す代わりに(これはかなり面倒です。ユーザーはすべての値を指定する必要はありませんが、適切なデフォルトを指定する必要があります)、環境を介して直接値を渡すだけで、通常の呼び出しが表示されます。お気に入り:
SERVER=blah INSTANCE=foo Script
ユーザーが叫ぶ必要がないように、小文字の変数名を使用するとよいでしょう。これにより、スクリプトが可能になるため、スクリプトの開始時に変数の値が設定されるため、コマンドラインを完全に解析することは避けてください。