11

我有脚本,我需要在其中显示使用命令,以防用户在执行脚本时错过任何强制性信息。

Usage : Script -s <server> -i <instance> -u <user> -p <password> <query> -w <warning value> -c <critical value>

附上关于所有的解释OPTIONS

我从以下变量时尚的参数中获取值。但我希望这种用法与 shell 脚本中的验证一起使用。

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"

应该做的伎俩。

编辑:按照@technosaurus 的建议在脚本中添加了参数验证

于 2013-02-20T10:31:54.633 回答
1

getopts是有充分理由的。您应该更改脚本的界面以符合人们的期望。

或者,您可以使用getopts两次,首先用于预query选项shift,然后用于其余选项。

于 2013-02-20T10:59:37.873 回答
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 回答
0

嗯,一个非常像穴居人的方式是这样的

usage ()
{
  echo 'Usage : Script -s <server> -i <instance> -u <user> -p <password>'
  echo '                  <query> -w <warning value> -c <critical value>'
  exit
}

[ ${13} ] || usage
于 2013-02-20T08:44:34.157 回答
0

这是一种非标准方法,但我发现它非常有用。无需将值作为参数传递给特定标志(这很烦人;不应该要求用户指定每个值,但应该提供合理的默认值),您可以简单地通过环境直接传递它们,这样典型的调用看起来像:

SERVER=blah INSTANCE=foo Script 

如果您使用小写的变量名称会很好,这样用户就不必大喊大叫了。这允许脚本如此简单地避免完全解析命令行,因为变量的值将在脚本开始时设置。

于 2013-02-21T01:10:24.100 回答