11

スクリプトの実行中にユーザーが必須情報を見逃した場合に備えて、使用コマンドを表示する必要があるスクリプトがあります。

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 を提案しました。

これについて私を助けてください..

4

5 に答える 5

23

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によって提案されたように、スクリプトに引数の検証を追加しました

于 2013-02-20T10:31:54.633 に答える
1

これを試してください

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

お役に立てれば

于 2013-02-20T14:02:05.573 に答える
1

getopts正当な理由で愚痴です。人々が期待するものに適合するように、スクリプトのインターフェイスを変更する必要があります。

または、2 回使用することもできますgetopts。最初はプレqueryオプション、shift次に残りのオプションです。

于 2013-02-20T10:59:37.873 に答える
0

これは非標準のアプローチですが、非常に便利だと思います。値を引数として特定のフラグに渡す (かなり面倒です。ユーザーはすべての値を指定する必要はありませんが、適切なデフォルトを指定する必要があります) 代わりに、環境を介して値を直接渡すことができるため、典型的な呼び出しは次のようになります。お気に入り:

SERVER=blah INSTANCE=foo Script 

ユーザーが叫ぶ必要がないように、小文字の変数名を使用すると便利です。これにより、スクリプトの開始時に変数の値が設定されるため、スクリプトはコマンドラインを完全に解析することを避けることができます。

于 2013-02-21T01:10:24.100 に答える