点击返回 自学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. 坑爹的InetAddress getLocalHost函数

    今天在跑dubbo 的 DemoService 2.5.4-SNAPSHOT版本的时候,遇到到一个奇怪的问题.consumer怎么都连接不上provider的服务.最后才发现是由于dubbo自 己实现 ...

  2. Linux下修改/设置环境变量JAVA_HOME

    export设置只对当前的bash登录session有效.这是存在内存里面的.你可以写入文件一般的文件.之后source它.或者放到/etc/profile 等等的位置里,不同的地方效果不同. 1. ...

  3. 利用数据库触发器让字段与自增长Id相关联

    十年河东,十年河西,莫欺少年穷 学无止境,精益求精 今天是数据库脚本类的代码,所以不想过多阐述 如下数据表: create table Card( Id ,) primary key, CardNo ...

  4. 微信小程序——获取用户unionId

    1.获取code 2.获取openid 3.获取access_token 4.获取unionid

  5. 【php增删改查实例】第十九节 - session的使用: 让服务器知道你是谁?

    因为HTTP请求是一种无状态的请求,所谓无状态,就是服务器不会记录下你本次请求的信息.http它是基于请求 - 相应模式的一种数据传输协议.就是说,你发送一个请求,我服务器给你一个响应,这件事情就算完 ...

  6. 机器学习 第五篇:分类(kNN)

    K最近邻(kNN,k-NearestNeighbor)算法是一种监督式的分类方法,但是,它并不存在单独的训练过程,在分类方法中属于惰性学习法,也就是说,当给定一个训练数据集时,惰性学习法简单地存储或稍 ...

  7. Mysql8.0的登录大坑……(忘记登录密码也可以这么搞)

    关于安装和使用就不说了,属于基本操作了: 我来重点记录一下关于使用前,使用navicat登录的时候报错,1130和2059 查看安装后随机生成的密码: grep 'temporary password ...

  8. CSS 分类 (Classification) 实例

    CSS 分类 (Classification) 实例CSS 分类属性 (Classification)CSS 分类属性允许你控制如何显示元素,设置图像显示于另一元素中的何处,相对于其正常位置来定位元素 ...

  9. zookeeper Error contacting service 解决

    连接kafka集群,有一个kafka机器连接失败 到该kafka机器上查询kafka进程,发现没有, 再查看zookeeper状态,提示 Error contacting service. It is ...

  10. Centos7.3下安装Jumpserver 1.0.0(支持windows组件)

    Jumpserver最新版本支持windows组件,废话不多介绍了,下面直接介绍下部署过程: 0)系统环境 CentOS 7.3 IP: 192.168.10.210 [root@jumpserver ...