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
linux之getopts的更多相关文章
- linux命令getopts
		一.getopts 简介 由于shell命令行的灵活性,自己编写代码判断时,复杂度会比较高.使用内部命令 getopts 可以很方便地处理命令行参数.一般格式为: getopts options va ... 
- Linux getopt/getopts解析命令行参数教程
		一.说明 shell中获取参数可以直接使用$1.$2等形式来获取,但这种方式有明显的限制:每个参数的位置是固定的.比如如果在设计上$1是ip地址$2是端口,那在执行时就必须第一个参数是ip第二个参数是 ... 
- Linux 驱动开发
		linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ... 
- 自学Linux Shell13.2-选项处理(主要getopt、getopts命令)
		点击返回 自学Linux命令行与Shell脚本之路 Bash shell提供了一些不同的方法来从用户处获得数据,包括以下3中方法: 命令行参数(添加在名利后面的数据) 命令行选项(可修改命令行为的单个 ... 
- Linux命令参数处理 shell脚本函数getopts
		getopts 命令 用途 处理命令行参数,并校验有效选项. 语法 getopts 选项字符串 名称 [ 参数 ...] 描述 getopts 的设计目标是在循环中运行,每次执行循环,getopts ... 
- LINUX - getopts
		getopts optionString opt; optionString :所有参数组成的-参数串: opt:从optionString 每次取的参数值: 当optionString用[:]开头, ... 
- Linux命令随笔
		Linux命令总结 man ==命令帮助; help ==命令的帮助(bash的内置命令); ls ==list,查看目录列表; -ld:查看目录权限; -l:(long)长格式显示属性; -F:给不 ... 
- 最全的linux命令大全,shell运维手册
		shell实例手册 0 说明{ 手册制作: 雪松} 1 文件{ ls -rtl # 按时间倒叙列出所有目录和文件 ll -rt touch file ... 
- Linux Shell编程入门
		从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操 ... 
随机推荐
- 阶段5 3.微服务项目【学成在线】_day04 页面静态化_21-页面静态化-静态化测试-静态化程序编写
			public String getPageHtml(String pageId){ /** * 静态化程序获取页面的DataUrl * * 静态化程序远程请求DataUrl获取数据模型 * * 静态化 ... 
- 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_09-webpack研究-webpack介绍
			使用vue.js开发大型应用需要使用webpack打包工具,本节研究webpack的使用方法. 1.3.1 webpack介绍 Webpack 是一个前端资源的打包工具,它可以将js.image.cs ... 
- mfc移动文件夹
			SHFILEOPSTRUCT FileOp; ZeroMemory((void*)&FileOp,sizeof(SHFILEOPSTRUCT)); FileOp.fFlags = FOF_NO ... 
- Nginx+Keepalived高可用负载均衡
			转自 https://www.jianshu.com/p/da26df4f7d60 Keepalived+Nginx实现高可用Web负载均衡 Master backup vip(虚拟IP) 192.1 ... 
- Spring Aop(四)——基于Aspectj注解的Advice介绍
			转发地址:https://www.iteye.com/blog/elim-2395315 4 基于Aspectj注解的Advice介绍 之前介绍过,Advice一共有五种类型,分别是before.af ... 
- 图像欧拉数计算 matlab实现
			EUL = C - H 其中EUL表示欧拉数 C表示对象数 H表示孔洞数 欧拉数常用来识别数字: 识别数字 8 ,8 的欧拉数为 -1 ,不同于0,1,2,3,4,5,6,7,9 close all ... 
- Java基础——接口和抽象类
			接口(interface) 什么是接口? 接口时抽象方法的合集.接口不可以被直接被实例化. 为什么要使用接口? 为了扩展.Java不支持多继承,但是通过接口就可以实现“多继承” 制定规则.接口就是规则 ... 
- nginx处理请求的11个阶段
			Nginx 处理请求的过程一共划分为 11 个阶段,按照执行顺序依次是 post-read.server-rewrite.find-config.rewrite.post-rewrite.preacc ... 
- HTML5 & CSS初学者教程(详细、通俗易懂)
			前端语言基础:HTML5 & CSS (一) HTML5:超文本标记语言 (1) 基本概念 是由一系列成对出现的元素标签(标记)嵌套组合而成 ( XML也是标签构成的 ) 这些标签以的形式出现 ... 
- kafka2.10集群搭建(一)
			一.kafka集群搭建 1.上传解压 2.配置文件的配置 1.修改 server.properties文件 broker.id=11 #192.168.199.11 #21 一般使用ip后三位 lis ... 
