暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

浅谈shell脚本处理命令行方式

浙金科技无限 2020-07-06
496

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 后跟两个冒号,表示有一个可选的参数(参数必须紧挨着选项)

长选项的定义相同,但用逗号分割。


测试代码:


执行结果:


谢谢阅读~


文章转载自浙金科技无限,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论