在编写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@LovelyLP 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@LovelyLP 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

使用getopts处理shell中的输入参数的更多相关文章

  1. Shell脚本中判断输入参数个数的方法投稿:junjie 字体:[增加 减小] 类型:转载

    Shell脚本中判断输入参数个数的方法 投稿:junjie 字体:[增加 减小] 类型:转载   这篇文章主要介绍了Shell脚本中判断输入参数个数的方法,使用内置变量$#即可实现判断输入了多少个参数 ...

  2. shell中交互输入自动化

    shell中交互输入自动化 shell中有时我们需要交互,但是呢我们又不想每次从stdin输入,想让其自动化,这时我们就要使shell交互输入自动化了.这个功能很有用的哟.好好学习. 1    利用重 ...

  3. shell编程学习笔记(五):Shell中脚本的参数

    在执行Shell脚本的时候,可以在执行时带上参数,相当于传递参数给脚本,下面我们看一下怎么使用这个参数 以下蓝色字体部分为Linux命令,红色字体的内容为输出的内容: # cd /opt/script ...

  4. Controller中获取输入参数注解使用总结

    1.处理request的uri部分的参数(即restful访问方式):@PathVariable. 当使用restful访问方式时, 即 someUrl/{paramId}, 这时的参数可通过 @Pa ...

  5. bean shell 中parameter传递参数的方法

    1.在csv set data config中添加用到的数据文件,并进行配置 2.在这一栏中,可以引入数据文件中的数据,用法如下${变量名},多个变量用空格隔开.在脚本中进行引用时,采用bsh.arg ...

  6. shell 中命令输入的快!捷!键!

    非常棒!! 非常棒!! 删除ctrl + d 删除光标所在位置上的字符相当于VIM里x或者dlctrl + h 删除光标所在位置前的字符相当于VIM里hx或者dhctrl + k 删除光标后面所有字符 ...

  7. Shell最多可以输入多少个参数?

    在脚本编写过程中,通常会涉及到参数的输入.譬如,sh 1.sh 10 20,在执行1.sh这个脚本中,10即为第一个参数,20即为第二个参数.有时,就会有这个疑惑,即shell脚本最多可以支持多少个变 ...

  8. 脚本乐园 Shell中命令行选项和参数的处理

    在Linux的Shell中怎样处理tail -n 10 access.log这样的命令行选项呢?这是被别人问起的一个问题,好好学习了一下,进行总结如下:在bash中,可以用以下三种方式来处理命令行参数 ...

  9. linux脚本:shell, 判断输入参数的个数(命令行)

    if [ $# != 3 ] ; thenecho "USAGE: $0 from to"echo " e.g.: $0 ~/oucaijun/from ~/oucaij ...

随机推荐

  1. jQuery实用的语法总结

    1.关于页面元素的引用 通过jquery的$()引用元素包括通过id.class.元素名以及元素的层级关系及dom或者xpath条件等方法,且返回的对象为jquery对象(集合对象),不能直接调用do ...

  2. Android去掉listView,gridView等系统自带阴影

    当我们使用listView的时候,拉到顶,或是拉到底部的时候,我们会发现有系统自带的阴影效果出现,不同手机出现的颜色可能还会不一样. 在以前我始终都有注意到此问题,一直以为是系统自带的,不能去掉.也没 ...

  3. c#使用WebClient登录网站抓取登录后的网页

    C#登录网站实际上就是模拟浏览器提交表单,然后记录浏览器响应返回的会话Cookie值,再次发送请求时带着这个会话cookie值去请求就可以实现模拟登录的效果了. 如下类CookieAwareWebCl ...

  4. DOS 和 Linux 常用命令的对比

    DOS 和 Linux 常用命令的对比 许多在 shell 提示下键入的 Linux命令都与你在 DOS 下键入的命令相似.事实上,某些命令完全相同. 本附录提供了 Windows的 DOS 提示下的 ...

  5. WPF的一些总是记不住的Tips

    Margin(Left,Top,Right,Bottom); HorizontalAlignment(Height的Opposite,水平对齐方式):VerticalAlignment(Width的反 ...

  6. SSH实例(1)

    首先,配置struts.xml文件: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE st ...

  7. 更改(修改)mysql自动增序列改变从1000开始

    更改(修改)mysql自动增序列改变从1000开始 ************************************************************************** ...

  8. Maximum length of a table name in MySQL

    http://dev.mysql.com/doc/refman/5.7/en/identifiers.html The following table describes the maximum le ...

  9. how-to-redirect-cin-and-cout-to-files

    #include <iostream> #include <fstream> #include <string> void f() { std::string li ...

  10. MurmurHash算法:高运算性能,低碰撞率的hash算法

    MurmurHash算法:高运算性能,低碰撞率,由Austin Appleby创建于2008年,现已应用到Hadoop.libstdc++.nginx.libmemcached等开源系统.2011年A ...