脚本如何支持可变参数,参数可以不按顺序输入 by katana
很多人在写脚本的时候都是使用指定参数个数,例如: 从数据库得到某个部门的所有ip的某一天的cpu使用情况,或cpu使用率在某个范围内的所有ip信息,并按cpu使用大小排序 eg:./get_result.sh [日期] [部门] [CPU/MEM] [(是否排序)Y/N] [min] [max]………… 这样,每次输入我都必须6个参数,即使我不在乎是否排序,不在乎哪个部门,我只要全部门cpu使用率大于30小于50的机器信息,但为了填写cpu使用率的范围就必须输入前面4个参数,而且还必须得按顺序输入,否则就对应出错。 又例如: mysql的启动可以指定某些参数启动,也可以不指定参数,默认都读取配置文件参数,如果我只关心数据库是否绑定内网ip,我只要输入: ./mysqld_safe --bind-address=192.168.0.1 即可 脚本如何可以做到,用户既可以自己指定参数,不用记住参数的顺序,而不指定参数的时候使用默认参数呢? 可以使用shift命令: shift命令把所有的参数变量向下移动一个位置,使$2成为$1 $3成为$2依次递进。原来的$1将被丢弃,但$0仍将保持不变。$#会每次shift之后会减少一个。 while test $# -gt 0; do case "$1" in --help | -h ) echo_help #打印帮助信息 exit ;; --date=* ) DATE=`echo "$1" | sed -e "s;--date=;;"`;; --type=* ) TYPE=`echo "$1" | sed -e "s;--type=;;"`;; --service_group=* ) SERVICE_GROUP=`echo "$1" | sed -e "s;--service_group=;;"`;; --order=*) ORDER=`echo "$1" | sed -e "s;--order=;;"`;; --min=*) MIN=`echo "$1" | sed -e "s;--min=;;"`;; --max=*) MAX=`echo "$1" | sed -e "s;--max=;;"`;; --* ) echo "无此输入项: $1"; exit 1 ;; * ) break ;; esac shift done if [ "$DATE" == "" ] then DATE=`date -d"1 day ago" +%Y-%m-%d` fi if [ "$TYPE" == "" ] then TYPE="CPU" fi if [ "$SERVICE_GROUP" == "" ] then SERVICE_GROUP="ALL" fi if [ "$ORDER" == "" ] then ORDER="N" fi if [ "$MIN" == "" ] then MIN=0 fi if [ "$MAX" == "" ] then MAX=100 fi 例如我要选择默认全部门所有昨天cpu使用率大于30,小于50的ip信息: ./get_result_new.sh --min=30 --max=50 即可,不用输入前面参数的默认值 这样,每个参数都有一个默认值,只有当你输入参数的时候,你输入的参数才会生效,否则都取默认值,这样大大的提高了脚本的可用性,用户感也非常好。 这样的脚本才够专业:) 本文原创自无线技术运营空间: http://wireless.qzone.qq.com 及 http://blog.youkuaiyun.com/wireless_tech (专注无线技术运营——无线技术(操作系统/数据库/WEB前端/负载均衡/系统容灾/系统安全/短信接入/WAP接入/3G等)、无线业务运营、无线开放平台、统计分析(用户行为分析/数据挖掘)、CP合作,联系我们:1780551083@qq.com) |