getopts

使用getopts处理shell中的输入参数


在编写shell脚本中,经常要处理一些输入参数,在上一篇文章中已经有了一个简短的介绍,在使用过程中发现getopts更加方便,能够很好的处理用户输入的参数和参数值。


getopts用于处理用户输入参数,举例说明使用方法:

while getopts :a:b:cdefg opt; do

   case $opts in

       a) do sth;

  ......

       cde) do another;

   esac

done


几个重要变量:

OPTIND:getopts使用OPTIND作为索引,来处理下一个需要处理的参数,记录当前的状态。

OPTARG:在上面的循环中,a,b两个参数后面各有一个冒号,冒号表示该输入的参数后面还有一个参数值,当getopts发现冒号后,会处理用户输入的参数值,这个参数值被保存在OPTARG中。

OPTSTRING:也就是上例中的 :a:b:cdefg,getopts需要处理的参数。注意,最前面的冒号“:”用于指定getopts工作于silent mode,在silent模式下,当用户输入的参数不满足OPTSTRING时,不会将illegal option这样的错误信息打印出来,使代码看起来更加专业。如果想要工作在verbose模式下,可以去掉最前面的冒号


下面,简单的写了一个shell脚本用来描述getopts的使用方法:

#!/bin/bash
function c1() {
cmd="rhc app create -p redhat"
while getopts  :a:t:snopt;

do
  case $optin in
       a) cmd=$cmd"-a $OPTARG";;
       t) cmd=$cmd"-t $OPTARG";;
       s) cmd=$cmd"-s";;
       n) cmd=$cmd"-n --no-dns";;
       \?)echo"Invalidparam";;
  esac
done
echo  $cmd
}

c1-a app1-t perl-5.10-s-n

执行这个脚本,我们就会得到预期的结果

[root@LovelyLPshell]# ./getopts-silent.sh
rhc app create-p redhat-a app1-t perl-5.10-s-n--no-dns


当然,有些时候,我们更新网将function写入.bashrc中,方便自己随时调用,如果将这段代码直接粘贴到.bashrc中,可能会引起问题:我没有得到预期的结果,脚本中的cmd并没有按照预想的情况得到处理,这是因为什么呢?

原因在于,保存在.bashrc后,第一次执行完成后,下一次在执行时,OPTIND不会重新产生,因为他被作为一个global variable使用,所以getopts在调用时,他的索引会变得混乱。在脚本中执行没有遇到这个问题的原因也在此,因为脚本每次执行时,都会调用一个新的shell,所以OPTIND会被设置为1。如果想要他在.bashrc中生效,必须要在最上面加上local OPTIND

让我们来稍微修改一下:

#Create apps
function create-apps() {
localOPTIND
   cmd="rhc appcreate -p $OPENSHIFT_PASSWD"
whilegetopts a:t:sn x
do
 case $xin in
           a) cmd=$cmd"-a $OPTARG";;
           t) cmd=$cmd"-t $OPTARG";;
           s) cmd=$cmd"-s";;
           n) cmd=$cmd"-n --no-dns";;
           \?)echoInvalid Params ;;
 esac
done
echo$cmd
}

source之后,我们可以直接调用,看一下是否达到了我们预期的结果:

[root@LovelyLPshell]# create-apps -a free -t jbsseap -n
rhc app create-p redhat-a free-t jbsseap-n--no-dns



你可能感兴趣的:(getopts)