shell脚本中用getopts处理用户输入选项和参数

shell脚本中用getopts处理用户输入选项和参数,举例说明使用方法:
 
while getopts :a:b:cdefg opt; do
    case $opts in
        a) do sth;;
        cde) do another;;
        ?)exit;;
    esac
done
 
几个重要变量:

    OPTSTRING   也就是上例中的 :a:b:cdefg,getopts需要处理的参数。注意,最前面的冒号“:”用于指定getopts工作于silent mode,在silent模式下,当用户输入的参数不满足OPTSTRING时,不会讲illegal option这样的错误信息打印出来,使代码看起来更加专业。如果想要工作在verbose模式下,可以去掉最前面的冒号.
  varname    每次匹配成功的选项
  arg        参数列表,没写时它会取命令行参数列表
 
  $OPTIND    特殊变量,option index,会逐个递增, 初始值为1;getopts使用OPTIND作为索引,来处理下一个需要处理的参数,记录当前的状态。
 
  $OPTARG    特殊变量,option argument,不同情况下有不同的值;参数后面若有一个冒号,表示该输入的选项后面还有一个参数值,当getopts发现冒号后,会处理用户输入的参数值,这个参数值被保存在OPTARG中。
 
默认情况下上面的函数第一次执行完成后,下一次在执行时,会跳过while循环,因为OPTIND不会重新产生,他被作为一个global variable使用,所以getopts在调用时,他的索引作为共享资源会变得混乱。在脚本中每次执行时,都会调用一个新的shell,所以OPTIND会被设置为1。如果想要他每次都能重新被调用,必须要在调用getopts前面某一行加上local OPTIND,生命OPTIND为局部变量,这样当调用完getopts后OPTIND就被释放,下次调用时又重新生成新的OPTIND并重新执行getopts函数。

-------------------------------------------------------
function hello(){
    ##local OPTIND ##OPTIND默认为全局变量
    while getopts :a: opt; do
         case $opts in
         a) echo "OPTARG";;
         ?)exit;;
         esac
    done
}

#调用
hello -a nihaoma
hello -a wohenhao
-------------------------------------------------------


==结果==============================
nihaoma
nihaoma
====================================


-------------------------------------------------------
function hello(){
    local OPTIND ##声明OPTIND为局部变量
    while getopts :a: opt; do
         case $opts in
         a) echo "OPTARG";;
         ?)exit;;
         esac
    done
}

#调用
hello -a nihaoma
hello -a wohenhao
-------------------------------------------------------


==结果==============================
nihaoma
wohenhao
====================================

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值