在编写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:

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

   2) 参数后跟两个冒号,表示该选项后必须跟一个参数,同时参数必须紧跟在选项后不能以空格隔开。该参数的指针赋给optarg。

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


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

#!/bin/bash

cmd="rhc app create -p redhat"

while getopts :a:t:sn opt; do

    case $opt in

        a) cmd=$cmd" -a $OPTARG" ;;

        t) cmd=$cmd" -t $OPTARG" ;;

        s) cmd=$cmd" -s" ;;

        n) cmd=$cmd" -n --no-dns" ;;

        \?) echo "Invalid param $OPTARG" ;;

    esac

done

echo $cmd


运行,将得到你要的结果:

[root@cnsz17pl1612 app]# ./s.sh  -a arg1 -t targ -s

rhc app create -p redhat -a arg1 -t targ -s


试一个错误的参数-p:

[root@cnsz17pl1612 app]# ./s.sh  -a arg1 -t targ -s -p jjj

Invalid param p

rhc app create -p redhat -a arg1 -t targ -s


如果要将function写入.bashrc中,必须要在脚本开头加上local OPTIND