我有脚本,我需要显示使用命令,以防用户在执行脚本时错过任何必要信息。
Usage : Script -s <server> -i <instance> -u <user> -p <password> <query> -w <warning value> -c <critical value>
解释所有OPTIONS
我从参数中得到的值如下变量fashion。但我希望在shell脚本中使用此验证。
SERVER=$1
INSTANCE=$2
USER=$3
DB_PASSWD=$4
QUERY=$5
VAL_WARN=$6
VAL_CRIT=$7
我尝试过使用getopts,但由于<query>
在传递值之前没有-q
参数,因此无法使用。
我已经尝试过寻找所有其他方法,但是每个人都建议使用getopts,这对我来说是不可行的解决方案。
请帮帮我..
答案 0 :(得分:22)
使用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
的建议在脚本中添加参数验证答案 1 :(得分:1)
getopts
正在哄骗good reason。你应该改变你的脚本界面以符合人们的期望。
或者,您可以使用getopts
两次,首先使用前query
选项,shift
,然后再使用{{1}}。
答案 2 :(得分: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
希望这会有所帮助
答案 3 :(得分:0)
这是一种非标准方法,但我觉得非常有用。而不是将值作为参数传递给特定标志(这是非常烦人的;用户不应该被要求指定每个值,但应该提供合理的默认值),您可以直接通过环境传递它们,这样一个典型的调用就会看起来像:
SERVER=blah INSTANCE=foo Script
如果您使用小写变量名称会很好,所以用户不必大喊大叫。这允许脚本完全避免完全解析命令行,因为在脚本开始时将设置变量的值。