自学Linux Shell13.2-选项处理(主要getopt、getopts命令)
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命令)的更多相关文章
- 自学Linux Shell13.1-命令行参数
点击返回 自学Linux命令行与Shell脚本之路 Bash shell提供了一些不同的方法来从用户处获得数据,包括以下3中方法: 命令行参数(添加在名利后面的数据) 命令行选项(可修改命令行为的单个 ...
- 自学Linux Shell13.3-获得用户输入(read命令)
Bash shell提供了一些不同的方法来从用户处获得数据,包括以下3中方法: 命令行参数(添加在名利后面的数据) 命令行选项(可修改命令行为的单个字母)主要getopt.getopts命令 直接从键 ...
- 自学Linux Shell12.7-控制循环break、continue命令
点击返回 自学Linux命令行与Shell脚本之路 12.7-控制循环break.continue命令 break命令.break命令用于跳出循环,使用break可以跳出任何类型的循环:for.whi ...
- 自学Linux命令行与Shell脚本之路
自学Linux命令行与Shell脚本之路[第一回]:初识Linux 1.1 自学Linux Shell1.1-Linux初识 1.2 自学Linux Shell1.2-Linux目录结构 1.3 ...
- 函数参数选项的处理getopt getopt_long getopt_long_only
转载:http://blog.chinaunix.net/uid-20321537-id-1966849.html 在头文件中int getopt(int argc,char *argv[], c ...
- 自学Linux Shell1.3-Linux文件系统
点击返回 自学Linux命令行与Shell脚本之路 1.3-Linux文件系统 文件系统是文件存放在磁盘等存储设备上的组织方法.Linux系统能支持多种目前流行的文件系统,如EXT2. EXT3. F ...
- 自学Linux Shell2.1-进入shell命令行
点击返回 自学Linux命令行与Shell脚本之路 2.1-进入shell命令行 进入文本命令行界面(CLI)两种方法: 控制台终端 图形化终端 1. 通过Linux控制台终端访问CLI 按下Ctrl ...
- 自学Linux Shell2.2-GHOME Terminal仿真器
点击返回 自学Linux命令行与Shell脚本之路 2.2-GHOME Terminal仿真器 GNOME Terminal是GNOME桌面环境的默认终端仿真器.很多发行版,如RHEL.Fedora和 ...
- 自学Linux Shell3.1-帮助命令man
点击返回 自学Linux命令行与Shell脚本之路 3.1-帮助命令man 1.man命令概述 默认bash shell提示符是美元符号($),这个符号表明shell在等待用户输入. Linux ma ...
随机推荐
- 锁、C#中Monitor和Lock以及区别
1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取锁之后因为异常,致锁 ...
- 【LGR-048 五周年庆贺】洛谷6月月赛
Luogu的五周年庆典比赛,还是比较满意的. 题目清新不毒瘤,数据优质不卡常,解法自然,为出题人点赞. 前三题的难度都很低,T5个人感觉还好.但是最后那个splay+hash是什么神仙东西. 最后好像 ...
- P5204 [USACO19JAN]Train Tracking 2
P5204 [USACO19JAN]Train Tracking 2 毒毒题,对着嘤文题解看了贼久 首先考虑此题的一个弱化版本:如果输入的所有\(c_i\)相等怎么做 现在假设有\(len\)个数,取 ...
- 【C#实现漫画算法系列】-判断 2 的乘方
微信上关注了算法爱好者这个公众号,有一个漫画算法系列的文章生动形象,感觉特别好,给大家推荐一下(没收过广告费哦),原文链接:漫画算法系列.也看到了许多同学用不同的语言来实现算法,作为一枚C#资深爱好的 ...
- 基于BlogEngine.NET搭建个人博客
早些时候在万网以我自己的英文名买了个域名 giantliu.com又看到万网有一个免费版本的虚拟主机,而且还支持.net4.5这年头支持.net4.5的免费主机不多,本来想用阿里云/windows a ...
- Node.js系列-express(下)
前言 距上次更新博客又两个月多了,这两个月内除了上班时间忙公司的项目外,下班后也没有闲着,做了点外包,有小程序的,管理端的项目.也可能那段时间做的外包项目也都比较急,所以晚上都搞到一点左右睡,严重的压 ...
- GlusterFS分布式存储系统中更换故障Brick的操作记录
前面已经介绍了GlusterFS分布式存储集群环境部署记录,现在模拟下更换故障Brick的操作: 1)GlusterFS集群系统一共有4个节点,集群信息如下: 分别在各个节点上配置hosts.同步好系 ...
- Linux下IP SAN共享存储操作记录
一.简单介绍SAN,即存储区域网络(storage area network and SAN protocols),它是一种高速网络实现计算机与存储系统之间的数据传输.常见的分类是FC-SAN和IP- ...
- <<浪潮之巅>>阅读笔记三
纵看世界,横看国内.我们国内也有很多很优秀的企业正在走向或者已经处于浪潮之巅.阿里巴巴.腾讯和百度这三巨头应该是我们计算机行业的龙头.但是 不得不说,在创新方面我们做的并不多,这是值得每一个从事计算机 ...
- 结对项目https://github.com/bxoing1994/test/blob/master/源代码
所选项目名称:文本替换 结对人:曲承玉 github地址 :https://github.com/bxoing1994/test/blob/master/源代码 结对人github地址:ht ...