zoukankan      html  css  js  c++  java
  • linux之getopts

    在编写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: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" ;;
        esac
    done
    echo $cmd
     }

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

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

    [root@linuxidc shell]# ./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() {
        local OPTIND
        cmd="rhc app create -p $OPENSHIFT_PASSWD"
        while getopts a:t:sn x
        do
            case $x in
                a) cmd=$cmd" -a $OPTARG" ;;
                t) cmd=$cmd" -t $OPTARG" ;;
                s) cmd=$cmd" -s" ;;
                n) cmd=$cmd" -n --no-dns" ;;
                ?) echo Invalid Params ;;
            esac
        done
        echo $cmd
     }

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

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

    如果还不是很了解,你可以简单的看下这个例子,这个例子是如果传递进来的参数包括f,那么执行对应代码:

    while getopts "dfiPRrvW" opt      //赋值给opt
          do
            case $opt in
                f)                      //如果传递进来是f
                  exec $realrm "$@"
                    ;;
                *)
                  
                  # do nothing      //传递其他参数,包括d,i,p,r,v,w
                    ;;
            esac
          done

  • 相关阅读:
    Kafka 不停机修改某一个topic数据保存时间
    jvisualvm 工具使用
    jmap命令详解----查看JVM内存使用详情
    C语言计算时间函数 & 理解linux time命令的输出中“real”“user”“sys”的真正含义
    JVM NativeMemoryTracking 分析堆外内存泄露
    java调用shell脚本并传递参数
    top -H -p查看某个进程内部线程占用情况分析: pstack显示每个进程的栈跟踪
    shell-awk 按列求和
    HTML&CSS基础-ps的基本操作
    HTML&CSS基础-清除浮动
  • 原文地址:https://www.cnblogs.com/chengjian-physique/p/7897099.html
Copyright © 2011-2022 走看看