点击返回 自学Linux命令行与Shell脚本之路html
Bash shell提供了一些不一样的方法来从用户处得到数据,包括如下3中方法:linux
13.2-选项处理
所谓的选项就是跟在破折号后面的单个字母,它能改变命令的行为。三种在脚本处理选项的方法:shell
- 查找选项,像命令行参数同样处理
- getopts命令
- getopt命令
1. 查找选项,像命令行参数同样处理
1.1 处理简单选项bash

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

1.2 分离参数和选项工具
同时使用参数和选项怎么办,linux使用特殊字符 -- 将两者分开,该字符告诉脚本何时选项结束以及普通参数何时开始。测试
1.3 处理带值的选项spa
有时候选项会带上一个额外的参数值。此时要求脚本必须能检测到并正确处理。命令行
2. getopts命令
因为shell命令行的灵活性,本身编写代码判断时,复杂度会比较高。为此,C提供了getopt/getopt_long等函数,C++的boost提供了Options库,在shell中,处理此事的是getopts和getopt。code
本节首先介绍getopts命令。
1 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是一个外部命令。
1 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 :长选项