web-dev-qa-db-ja.com

getoptsを使用せずにシェルスクリプトに使用状況コンテンツを追加する

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

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

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

10
San

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

22
matt.nguyen

これを試してみてください

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

お役に立てれば

1
Balram

getopts正当な理由 のために愚痴をこぼしています。スクリプトのインターフェイスを変更して、人々が期待するものに準拠させる必要があります。

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

1
just somebody

これは非標準的なアプローチですが、私が非常に役立つと思うアプローチです。特定のフラグに引数として値を渡す代わりに(これはかなり面倒です。ユーザーはすべての値を指定する必要はありませんが、適切なデフォルトを指定する必要があります)、環境を介して直接値を渡すだけで、通常の呼び出しが表示されます。お気に入り:

SERVER=blah INSTANCE=foo Script 

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

0
William Pursell