请选择 进入手机版 | 继续访问电脑版
查看: 353|回复: 3

[经验分享] 基于getopt的解析

[复制链接]

签到天数: 137 天

[LV.7]化身百千

发表于 2018-10-9 17:10:32 | 显示全部楼层 |阅读模式
在学习getopt如何使用之前,必须先知道命令行的一些常识。这些,都可以通过getopt来实现,但有些实现起来可能会比较复杂。

1.区分option、parameter、argument、option argument和non-option parament

parameter和argument都表示参数,前者通常表示独立性的参数,后者通常表示依赖于其它实体的参数。parameter的含义更广,argument可以看作parameter的一种。

例如,定义函数时function foo(x,y){CODE},函数的参数x和y称为parameter。调用函数并传递参数时,foo(arg1,arg2)中的arg1和arg2都是依赖于函数的,称为argument更合适,当然也可以称为更广泛的parameter。

再例如,一个命令行:

tar -zcf a.tar.gz /etc/pki
粗分的话,-z、-c、-f、a.tar.gz、/etc/pki都可以称为parameter。细分的话:

"-z -c -f"称为选项,即option
a.tar.gz是选项"-f"的选项参数(传递给选项的参数),依赖于选项,称为argument更合适,更严格的称呼是option argument
/etc/pki既不属于选项,也不属于某个选项的参数,它称为非选项类型的参数,对应的名称为non-option parameter
本文要介绍的是getopt,所以只考虑命令行参数的情况。

2.短选项和长选项以及它们的"潜规则"

Linux中绝大多数命令都提供了短选项和长选项。一般来说,短选项是只使用一个"-"开头,选项部分只使用一个字符,长选项是使用两个短横线(即"--")开头的。

例如"-a"是短选项,"--append"是长选项。

一般来说,选项的顺序是无所谓的,但并非绝对如此,有时候某些选项必须放在前面,必须放在某些选项的前面、后面。

一般来说,短选项:

可以通过一个短横线"-"将多个短选项连接在一起,但如果连在一起的短选项有参数的话,则必须作为串联的最后一个字符。

例如"-avz"其实会被解析为"-a -v -z",tar -zcf a.tar.gz串联了多个短选项,但"-f"选项有参数a.tar.gz,所以它必须作为串联选项的最后一个字符。

短选项的参数可以和选项名称连在一起,也可以是用空白分隔。例如-n 3和-n3是等价的,数值3都是"-n"选项的参数值。
如果某个短选项的参数是可选的,那么它的参数必须紧跟在选项名后面,不能使用空格分开。至于为什么,见下面的第3项。

一般来说,长选项:

可以使用等号或空白连接两种方式提供选项参数。例如--file=FILE或--file FILE。
如果某个长选项的参数是可选的,那么它的参数必须使用"="连接。至于为什么,见下面的第3项。
长选项一般可以缩写,只要不产生歧义即可。
例如,ls命令,以"a"开头的长选项有3个。

$ ls --help | grep -- '--a'
  -a, --all                  do not ignore entries starting with .
  -A, --almost-all           do not list implied . and ..
      --author               with -l, print the author of each file
如果想要指定--almost-all,可以缩写为--alm;如果想要指定--author,可以缩写为--au。如果只缩写为"--a",bash将给出错误提示,长选项出现歧义:

$ ls --a
ls: option '--a' is ambiguous; possibilities: '--all' '--author' '--almost-all'
Try 'ls --help' for more information.
3.不带参数的选项、可选参数的选项和带参数的选项

有不同类型的命令行选项,这些选项可能不需要参数,也可能参数是可选的,也可能是强制要求参数的。

前面说了,如果某个选项的参数是可选的,那么它的参数必须不能使用空格将参数和选项分开。如果使用空格分隔,则无法判断它的下一个元素是该选项的参数还是非选项类型的参数。

例如,-c和--config选项的参数是可选的,要向这两个选项提供参数,必须写成-cFILE、--config=FILE,如果写成-c FILE、--config FILE,那么getopt无法判断这个FILE是提供给选项的参数,还是非选项类型的参数。

一般来说,使用可选参数的情况非常少,至少我目前回忆不起来这样的命令。

4.使用"--"将选项(及它们的选项参数)与非选项类型参数进行分隔

unix的命令行中,总是可以在非选项类型的参数之前加上"--",表示选项和选项参数到此为止,后面的都是非选项类型的参数。

例如:

seq -w -- 3
seq -w -- 1 3
分别表示3和"1 3"是seq的非选项类型参数,而"--"前面的一定是选项或选项参数。

5.命令行参数中的短横线开头的并不一定总是短选项,也可能是负数参数

例如seq命令:

seq -w -5 -1 5
其中-5和-1都是负数非选项类型的参数。

6.选项的依赖性和互斥性

有些命令的选项是有依赖性和互斥性的。比如某个选项要和另一个选项一起使用,某个选项不能和另一个选项一起使用。

例如--manage --remove,只有在使用了--manage的前提下才能使用--remove,否则就应该报错。

7.模式化(模块化)类型的选项

很多unix命令都将选项进行模块化设计。例如ip命令,address模式、route模式、link模式等等。

ip addr OPTIONS
ip route OPTIONS
ip link OPTIONS
ip neigh OPTIONS
8.其他特性的选项

有些命令还有比较个性化的选项,比如head命令,-n NUM选项,即可以指定为-3,也可以指定为-n 3或-n3。

签到天数: 137 天

[LV.7]化身百千

 楼主| 发表于 2018-10-11 09:54:15 | 显示全部楼层

                  
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

返回顶部