By francis_hao    Jul 5,2017

 

getopts是shell的一个内置命令。

概述

getopts optstring
name [args]
OPTIND,OPTARG,OPTERR

 

描述

getopts被shell程序用来分析位置参数,optstring包含需要被识别的选项字符,如果这里的字符后面跟着一个冒号,表明该字符选项需要一个参数,其参数需要以空格分隔。冒号和问号不能被用作选项字符。getopts每次被调用时,它会将下一个选项字符放置到变量name中。

变量OPTIND是下一个要被处理的位置参数的索引,初始值为1。shell不会自动的复位OPTIND,如果想再次对位置参数进行分析,则需要手动对OPTIND进行复位。当选项需要参数时,getopts将参数放置在变量OPTARG中。

当所有的位置参数分析结束,getopts退出并返回一个大于0的值,OPTIND变为首个不是选项的位置参数的索引,name被置为'?'。默认情况下getopts会去分析传入的位置参数,但如果args有值,则只会分析args里的参数,args只支持形如-abc形式。

如果遇到错误,getopts会打印出错误信息,但如果optstring第一个字符是冒号,或者变量OPTERR被置为0(此项只是不打印错误信息,不会在出错后设置OPTARG的值),则会进入静默模式,不会打印错误信息。遇到的错误通常有两种情况:
1、无效的选项,此时name会被置为'?'。静默模式下,会将此无效选项置于OPTARG。非静默模式,打印错误信息,并且unset OPTARG。
2、选项需要的参数未提供,静默模式下,name会被置为':',无效选项会置于OPTARG。非静默模式,name被置为'?',unset OPTARG并打印出错信息。

getopts如果遇到一个选项(无论是否有效),返回true(0)。如果遇到结束或者产生错误,返回false

 

示例

示例来自参考【2】

#!/bin/sh
while
getopts
:ab:c: OPTION;do
    case
$OPTION
in
    a)echo
"get option a"
    ;;

    b)echo
"get option b and parameter is $OPTARG"
    ;;

    c)echo
"get option c and parameter is $OPTARG"
    ;;

    ?)echo
"get a non option $OPTARG and OPTION is $OPTION"
    ;;

    esac
done

 

 

一个运行实例

其中,-a和-b是正确的选项,-p和-c分别对应错误选项的两种情况。

 

 


本文由 刘英皓 创作,采用 知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议进行许可。欢迎转载,请注明出处:
转载自:http://www.cnblogs.com/yinghao1991/p/7123550.html

 

 

参考

【1】man bash

【2】D.坦思.linux与unix shell编程指南.机械工业出版社.2000-1

shell里的getopts的更多相关文章

  1. shell脚本学习之Bash shell 里各种括号的用法

    今天在 SegmentFault 上看到又有人问起关于Shell里各种括号的问题.对于很多玩Shell的人,括号是个很尴尬的问题,用起来没问题,说起来不明白,我在这里总结一下Bash Shell几种括 ...

  2. [记录]Shell中的getopts和getopt用法

    Shell中的getopts和getopt用法 1.getopts getopts(shell内置命令)不能直接处理长的选项(如:--prefix=/home等),getopts有两个参数,第一个参数 ...

  3. Bash Shell 里的各种括号

    天在 SegmentFault 上看到又有人问起关于Shell里各种括号的问题.对于很多玩Shell的人,括号是个很尴尬的问题,用起来没问题,说起来不明白,我在这里总结一下Bash Shell几种括号 ...

  4. Shell里的特殊符号

    Shell里的特殊符号: (1)单引号: 由单引号括起来的符号都作为普通字符处理,他们都失去了特殊意义. (2)双引号: 除美元符号($).倒引号.反斜线(\)仍保留特殊含义外,其余符号都作为普通字符 ...

  5. 千万不要往 Shell 里粘贴命令!

    对于用惯了 IDE 的程序员来说,在终端里敲命令可能没那么顺手,也记不住那么多复杂的命令.比较偷懒的做法就是网上搜相关的命令,复制到剪贴板往命令行窗口里一贴,完事! 但是这么做有很大的风险,为什么呢? ...

  6. Shell 里空语句怎么写 - 半角的冒号

    Python 里的空语句写作pass for x in range(10): pass Shell 里的空语句写作 : #!/bin/bash for x in {1..10} do #echo $x ...

  7. Linux命令参数处理 shell脚本函数getopts

    getopts 命令 用途 处理命令行参数,并校验有效选项. 语法 getopts 选项字符串 名称 [ 参数 ...] 描述 getopts 的设计目标是在循环中运行,每次执行循环,getopts ...

  8. linux下的Shell编程(3)shell里的流程控制

    if 语句 if 表达式如果条件命令组为真,则执行 then 后的部分.标准形式: if 判断命令,可以有很多个,真假取最后的返回值 then 如果前述为真做什么 [ # 方括号代表可选,别真打进去了 ...

  9. Hive的Shell里hive> 执行操作时,出现FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask错误的解决办法(图文详解)

    不多说,直接上干货! 这个问题,得非 你的hive和hbase是不是同样都是CDH版本,还是一个是apache版本,一个是CDH版本. 问题详情 [kfk@bigdata-pro01 apache-h ...

随机推荐

  1. MySQL 主从服务器配置

    在主服务器Ubuntu上进行备份,执行命令: mysqldump -uroot -p --all-databases --lock-all-tables > ~/master_db.sql -u ...

  2. MongoDB修改数据库名,collection名

    利用dropDatabase,copyDatabase修改Database名称 db.copyDatabase('old_name', 'new_name'); use old_name db.dro ...

  3. python基础之多线程

    概念 进程:进程就是一个程序在一个数据集上的一次动态执行过程 程序:代码 数据集:程序执行过程中需要的资源 进程控制块:完成状态保存的单元 线程:线程是寄托在进程之上,为了提高系统的并发性 线程是进程 ...

  4. AD-Powershell for Active Directory Administrators

    Table of Contents   Computer object commands Group object commands Organizational Unit (OU) commands ...

  5. 【题解搬运】PAT_L1-009 N个数求和

    从我原来的博客上搬运.原先blog作废. (伪)水题+1,旨在继续摸清这个blog(囧 题目 就是求N个数字的和.麻烦的是,这些数字是以有理数"分子/分母"的形式给出的,你输出的和 ...

  6. C++学习007-使用exit退出进程

    使用exit可以实现退出当前进程. 如下 在程序接收到一个字符后,就退出进程 编写环境 vs2015 int main() { int a = 10, b = 20; std::cout <&l ...

  7. python接口测试(二)——配置文件的使用

    在接口测试中,有些东西是固定不变的,比如url,若想更改的话就必须每个请求都更改,因此,可以放到配置文件中使用. 1.创建一个.ini的配置文件,如图: 2.读取配件文件中的内容,后续进行引用 #co ...

  8. Python Flask之旅

    <Pyhton Flask之旅> 以前学flask时做的总结,搬运到这里,markdown格式写的有点乱,凑合看吧. 参考博客 http://blog.csdn.net/nunchakus ...

  9. SDOI2013森林

    题面 主席树启发式合并,每次连边维护并查集,集合大小,求lca所需信息,合并两个树上的主席树, 重点看代码. #include <iostream> #include <algori ...

  10. Datenode无法启动

    执行start-dfs.sh后,或者执行datenode没有启动.很大一部分原因是因为在第一次格式化dfs后,启动并使用了hadoop,后来又重新执行了格式化命令 这时主节点namenode的clus ...