点击返回 自学Linux命令行与Shell脚本之路

Bash shell提供了一些不同的方法来从用户处获得数据,包括以下3中方法:

13.2-选项处理

所谓的选项就是跟在破折号后面的单个字母,它能改变命令的行为。三种在脚本处理选项的方法:

  • 查找选项,像命令行参数一样处理
  • getopts命令
  • getopt命令

1. 查找选项,像命令行参数一样处理

 1.1 处理简单选项

shift命令默认情况下将每个参数变量向左移动一个位置。 $3的值会移动到$2中,$2的值会移动到1中,$1的值则会被删除。
shift n 表示移动的位数
以上脚本通过测试第一个参数值的长度执行了一个while循环,当第一个参数的长度为0时,循环结束,测试完第一个参数后,shift命令会将所有的参数位置移动一个位置

 1.2 分离参数和选项

同时使用参数和选项怎么办,linux使用特殊字符   --    将二者分开,该字符告诉脚本什么时候选项结束以及普通参数什么时候开始。

 1.3 处理带值的选项

 有时候选项会带上一个额外的参数值。此时要求脚本必须能检测到并正确处理。

2. getopts命令

由于shell命令行的灵活性,自己编写代码判断时,复杂度会比较高。为此,C提供了getopt/getopt_long等函数,C++的boost提供了Options库,在shell中,处理此事的是getopts和getopt。

本节首先介绍getopts命令

 getopts optstring parameters
  • getopts命令内建于bash shell中
  • getopts命令能够和已有的shell参数变量默契配合
  • getopts命令,每次调用它的时候,它一次只处理命令行上检测到的一个参数
  • getopts命令,有效的选项字母都会列在optstring中
        如果选项字母要求有个参数值就加一个:   
        要去掉一个错误消息的话,可以再opstring之前加一个:
  • getopts命令会用到两个环境变量,
        如果选项需要跟一个参数值,OPTARG环境变量就会保存这个值。
        OPTIND环境变量保存了参数列表中getopts正在处理的参数位置。

举例1 :

输入 -a 后面没有参数的的时候,会报错误

举例2:

输入 -a 后面没有参数的的时候,也会报错误

举例3:

optstring位置是h:ms 
首先最前面没有:,就表示不会提示错误信息
h:表示选项-h 需要跟一个参数,并保存到OPTARG环境变量中,

3. getopt命令

getopts命令来帮助我们处理shell脚本选项和参数,其缺点是只能处理短选项,无法处理长选项。
 getopt是一个外部命令。

 getopt  optstring parameters
  • #-o表示短选项,两个冒号表示该选项有一个可选参数,可选参数必须紧贴选项,如-carg 而不能是-c arg
  • #--long表示长选项

其实大部分都和getopt命令相同,个别不同:

  • 选项:  表示-b选项需要一个参数值
  • -cd 会自动将分成两个独立的选项-c -d  (但此时会插入双破折线分割行中的额外参数)
  • 指定了一个不存在的选项,会产生一条错误信息
  • 如想忽略这条错误信息,可以在命令后加一个-q选项    getopt -q

4. 两者的比较

  • getopts 是 Shell 内建命令,getopt 是一个独立外部工具
  • getopts 使用语法简单,getopt 使用语法较复杂
  • getopts 不支持长参数(如:--option ),getopt 支持
  • getopts 不会重排所有参数的顺序,getopt 会重排参数顺序
  • getopts 出现的目的是为了代替 getopt, 较快捷的执行参数分析工作

参数传递的典型用法:

  • ./test.sh -a -b -c  : 短选项,各选项不需参数
  • ./test.sh -abc      : 短选项,和上一种方法的效果一样,只是将所有的选项写在一起。
  • ./test.sh -a args -b -c   :短选项,其中-a需要参数,而-b -c不需参数。
  • ./test.sh --a-long=args --b-long  :长选项

自学Linux Shell13.2-选项处理(主要getopt、getopts命令)的更多相关文章

  1. 自学Linux Shell13.1-命令行参数

    点击返回 自学Linux命令行与Shell脚本之路 Bash shell提供了一些不同的方法来从用户处获得数据,包括以下3中方法: 命令行参数(添加在名利后面的数据) 命令行选项(可修改命令行为的单个 ...

  2. 自学Linux Shell13.3-获得用户输入(read命令)

    Bash shell提供了一些不同的方法来从用户处获得数据,包括以下3中方法: 命令行参数(添加在名利后面的数据) 命令行选项(可修改命令行为的单个字母)主要getopt.getopts命令 直接从键 ...

  3. 自学Linux Shell12.7-控制循环break、continue命令

    点击返回 自学Linux命令行与Shell脚本之路 12.7-控制循环break.continue命令 break命令.break命令用于跳出循环,使用break可以跳出任何类型的循环:for.whi ...

  4. 自学Linux命令行与Shell脚本之路

    自学Linux命令行与Shell脚本之路[第一回]:初识Linux   1.1 自学Linux Shell1.1-Linux初识 1.2 自学Linux Shell1.2-Linux目录结构 1.3  ...

  5. 函数参数选项的处理getopt getopt_long getopt_long_only

    转载:http://blog.chinaunix.net/uid-20321537-id-1966849.html   在头文件中int getopt(int argc,char *argv[], c ...

  6. 自学Linux Shell1.3-Linux文件系统

    点击返回 自学Linux命令行与Shell脚本之路 1.3-Linux文件系统 文件系统是文件存放在磁盘等存储设备上的组织方法.Linux系统能支持多种目前流行的文件系统,如EXT2. EXT3. F ...

  7. 自学Linux Shell2.1-进入shell命令行

    点击返回 自学Linux命令行与Shell脚本之路 2.1-进入shell命令行 进入文本命令行界面(CLI)两种方法: 控制台终端 图形化终端 1. 通过Linux控制台终端访问CLI 按下Ctrl ...

  8. 自学Linux Shell2.2-GHOME Terminal仿真器

    点击返回 自学Linux命令行与Shell脚本之路 2.2-GHOME Terminal仿真器 GNOME Terminal是GNOME桌面环境的默认终端仿真器.很多发行版,如RHEL.Fedora和 ...

  9. 自学Linux Shell3.1-帮助命令man

    点击返回 自学Linux命令行与Shell脚本之路 3.1-帮助命令man 1.man命令概述 默认bash shell提示符是美元符号($),这个符号表明shell在等待用户输入. Linux ma ...

随机推荐

  1. odoo订餐系统之类型设计

    这次开发的模块是订餐的类型设计,比如大荤 小荤 蔬菜 米饭 等基本数据.1.设计model类,很简单就一个字段: class MyLunchProductionCategory(osv.Model): ...

  2. 算法相关——Java排序算法之冒泡排序(二)

    0. 前言 本系列文章将介绍一些常用的排序算法.排序是一个非常常见的应用场景,也是开发岗位面试必问的一道面试题,有人说,如果一个企业招聘开发人员的题目中没有排序算法题,那说明这个企业不是一个" ...

  3. bitset常用用法&&简单题分析

    Preface bitset,还是一个比较好用的STL,可以给一些题目做到神奇的常数优化(\(O(\frac{原来的复杂度}{机器的位数(32位or64位)})\)) 关于一些具体的函数等内容可以参考 ...

  4. [HAOI2017]方案数[组合计数、容斥、dp]

    题意 题目链接 分析 先考虑没有障碍怎么做,定义 f(i,j,k) 每一维走了 i,j,k 位的方案数,转移乘个组合数即可. 现在多了一些障碍,考虑容斥.实际我们走过的点都有严格的大小关系,所以先把所 ...

  5. browserify运行原理分析

    目前对于前端工程师而言,如果只针对浏览器编写代码,那么很简单,只需要在页面的script脚本中引入所用js就可以了. 但是某些情况下,我们可能需要在服务端也跑一套类似的逻辑代码,考虑如下这些情景(以n ...

  6. R实战 第十一篇:处理缺失值

    在真实的世界中,缺失数据是经常出现的,并可能对分析的结果造成影响.在R中,经常使用VIM(Visualization and Imputation of Missing values)包来对缺失值进行 ...

  7. Jvm远程监控

    服务器运行新建文件 : udi.policy grant codebase "file:${java.home}/../lib/tools.jar" { permission ja ...

  8. php 中self,this的区别和实地操作

    面向对象编程(OOP,Object OrientedProgramming)现已经成为编程人员的一项基本技能.利用OOP的思想进行PHP的高级编程,对于提高PHP编程能力和规划web开发构架都是很有意 ...

  9. E. Train Hard, Win Easy

    链接 [http://codeforces.com/contest/1043/problem/E] 题意 有n个人,每个人都有做出a,b题的分数,xi,yi,但是有些人是不能组队的,问你每个人和其他能 ...

  10. 个人博客作业_week3

    一. 评测 1.对方背景 这个好像大家都不一样,他要考四级啊,考六级啊,出国啊,或者平时写代码看不懂错误信息(呵呵)(还有可能是为了完成某次作业而用的....), 等等,所以是会用的.一般的问题都能解 ...