01
使用场景
命令行程序设计的首要任务是解析命令行参数,对参数采用了一种比较通俗的定义:命令行上除命令名之外的字符串。参数由多项构成,项与项之间用空白符彼此隔开。
参数进一步分为选项和操作数。选项用于修改程序的默认行为或为程序提供信息,选项后可以跟随一些参数,称为选项参数。
在linux系统中使用shell脚本时,存在需要解析命令行参数的时候,这时可以使用以下3种方式解析命令行参数:
1、直接处理
在shell脚本中直接使用$1,$2,$3…进行解析,数字表示参数的位置,因为直接处理高度依赖于命令行上所传参数的位置,所以一般都只用来处理较简单的参数。
--使用到的常用变量说明:
$0 #脚本本身文件名
$1 #第一个参数
$2, $3, $4 ... #第2、3、4个参数,依次类推
$# #参数的个数,不包括命令本身
$? #最后运行的命令的结束代码(返回值)即执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)
2、使用getopts命令
单个字符选项的情况,例如:*/test.sh -n 10 -f file.txt等选项。
3、使用getopt命令
处理单个字符或长选项(long-option),例如:--prefix=/home等。
小型脚本可以直接通过$1,$2,$3获取位置参数的方式去处理,脚本有需要使用到复杂的选项和参数时,大多数使用getopts命令, 而getopt相对比功能更加强大。
02
getopts/getopt命令运用
getopts和getop命令功能相似但又不完全相同,其中getopt是独立的可执行文件,而getopts是Bash内置的命令。
参数传递的典型用法:
1) ./test.sh -a -b -c :短选项,各选项不需参数
2) ./test.sh -abc :短选项,和1方法的效果一样,只是将所有的选项写在一起
3) ./test.sh -a args -b -c :短选项,其中-a需要参数,而-b -c选项不需参数
4) ./test.sh --a-long=args --b-long :长选项getopts命令不支持长选
getopts
语法格式
getopts [option[:]] [DESCPRITION] VARIABLE
option:表示为某个脚本可以使用的选项
":":如果某个选项(option)后面出现了冒号(":"),则表示这个选项后面可以接参数(即一段描述信息DESCPRITION)
VARIABLE:表示将某个选项保存在变量VARIABLE中
getopts是bash的内部命令, 一般用在循环中。每当执行循环的时候,getopts都会检查下一个命令选项,如果这些选项出现在option中,则表示是合法选项,否则不是合法选项。并将这些合法选项保存在VARIABLE这个变量中。getopts有两个参数,第一个参数是一个字符串,包括字符和“:”每一个字符都是一个有效选项,选项之间可以通过冒号 : 进行分隔,也可以直接相连接,: 表示选项后面必须带有参数,如果没有可以不加实际值进行传递。
例如:脚本中使用时,getopts abcde: option表明选项a、b、c、d可以不加实际值直接使用,而选项e必须在后面带上值。使用选项取值时,必须使用变量OPTARG保存该值。在使用getopts命令的时候,shell会自动产生两个变量OPTIND和OPTARG。
OPTARG 保存选项后的参数值
OPTIND 表示命令行下一个选项或参数的索引
测试代码:

执行结果:

结果说明:
当输入-b时,$OPT=b,$OPTARG=good,因此就会显示b选项中这一部分的信息。
由于这里有一个选项(-b)和一个参数(good),$OPTIND指向命令行中下一个选项或参数的索引位置,因此这里即为3。
shift $[$OPTIND-1]表示去掉文件名前面的选项和参数。
绝大多数脚本使用getopts命令就可以完成需要的功能,如果需要支持长选项以及可选参数,那么就需要使用getopt。
getopt
getopt 与 getopts两者的比较:
(1)getopts 是 Shell 内建命令,getopt 是一个独立外部工具
(2)getopts 使用语法简单,getopt 使用语法较复杂
(3)getopts 不支持长参数(如:--option ),getopt 支持
(4)getopts 不会重排所有参数的顺序,getopt 会重排参数顺序
例如:
./test -a -b arg arg1 -c
命令行中在arg后多了arg1参数,arg1前没有选项,在经过getopt和set之后,命令行会变为:-a –b arg -c -- arg1
$1指向-a,$2指向-b,$3指向arg,$4指向-c,$5指向--,而多出的arg1参数则被放到了最后。
脚本会将符合getopt参数规则的参数摆在前面,其他摆在后面,并在最后面添加--
(5)getopts 出现的目的是为了代替 getopt 较快捷的执行参数分析工作
getopt 命令的选项说明:
-a 使getopt长选项支持"-"符号打头,必须与-l同时使用
-l 后面接getopt支持长选项列表
-n program如果getopt处理参数返回错误,会指出是谁处理的这个错误
-o 后面接短参数选项,这种用法与getopts类似,
-u 不给参数列表加引号,默认是加引号的(不使用-u选项),例如在加不引号的时候 --longopt "select * from db1.table1" $2只会取到select ,而不是完整的SQL语句。
getopt选项的使用定义规则类似 getopts :
例如getopt的选项参数ab:c:: 表示的意思是:
a 后没有冒号,表示可以每月参数
b 后跟一个冒号,表示有一个必要的参数
c 后跟两个冒号,表示有一个可选的参数(参数必须紧挨着选项)
长选项的定义相同,但用逗号分割。
测试代码:

执行结果:





