2013-02-20 69 views
8

我有脚本,需要在用户在执行脚本时丢失任何必需信息的情况下显示使用情况命令。在没有getopts的情况下在shell脚本中添加使用内容

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对我来说不是可行的解决方案。

请帮我在这..

+1

选项字母的优点之一是它允许用户以任意顺序放置项目。如果订单是固定的,则无需打扰诸如'-s'的选项;这只是使用户类型额外的基本没有好处。我注意到原始命令行中的服务器字符串是'$ 2'(而不是'$ 1')。你不能调整你的命令,以便需要'-q',或者查询是最后一个参数吗?是否有任何选项具有合理的默认值?如果是这样,请使用它们而不是要求用户键入13个参数。您的用户会感谢您,并且您的脚本将更易于编写。 – 2013-02-21 02:00:30

回答

20

使用移通过所有的参数进行迭代,是这样的:

#!/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

+0

只需在最后检查'[! “$ PASSWORD”] && usage' #and其他强制性参数类似 – technosaurus 2013-02-21 03:01:04

+0

@technosaurus AFAICS检查已经存在:'while [“$ 1”!=“”] ...' – 2013-02-21 17:10:32

+0

这仍然可以工作'Script q q q q q q q q q q q q q'并且没有任何所需值将被设置为 – technosaurus 2013-02-21 18:42:21

1

getopts建议被婊子用于good reason。你应该改变脚本的界面以符合人们的期望。

或者,您可以使用getopts两次,第一次用于query之前的选项,shift,然后用于其余部分。

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 

希望这有助于

+1

或者你可以'为我在{1..13}''并摆脱subshel​​l。 – 2013-02-21 01:27:29

0

这是一个非标准的做法,而是一个我觉得非常有用。与其将值作为参数传递给特定标志(这相当恼人;不应要求用户指定每个值,但应提供合理的缺省值),您可以直接通过环境直接传递它们,以便典型的调用如:

SERVER=blah INSTANCE=foo Script 

这将是很好,如果您使用小写变量名称,因此用户不必喊。这允许脚本完全避免分析命令行,因为变量的值将在脚本开始时设置。

相关问题