Unix 命令行参数接口规范小结

要想成为一个合格的Unix程序员,那得会写命令行的程序,而命令行程序外部接口,也就是我们说的选项、参数需要遵守一定的规范,这样你写出来的程序才能被其它人看得懂,知道如何使用。

从接触linux开始,对命令行的参数规范一直很模糊,似懂非懂,现在越来越少人会去编写命令行的程序了,这个规范不难,但是一直没有找到相关文档,后来看《Unix环境高级编程》,在最后几章终于得知这个命令行接口的规范在SUS中定义了。

想当初极客之王Linus编写linux之前也是把这些标准啃了一遍..

本文主要参考susv4。

实用程序参数语法

1
2
utility_name[-a][-b][-c option_argument]
[-d|-e][-f[option_argument]][operand...]
  1. utility_name代表我们程序的名字,它的后面带有三种类型的参数:选项,选项的参数还有运算的对象。其中横杠-后面加一个字母或者数字的参数称为选项(option),某些选项后面带着:option-argument,如[-c option_argument]所示,跟在最后一个选项和选项参数之后的参数称为运算的对象。

  2. 选项的参数和选项之间用空白字符隔开,如果选项的参数带着方括号,这代表它们是可选的,在程序概要(也就是上面图所示的gcc的对选项参数概要)中必须将此类必须带有选项参数的分开出来展示,但是于此同时,程序必须允许该选项可以在选项字符串中存在而不需要空白字符隔开。

  3. 选项通常是按照字母顺序排序的。

  4. 那些需要用实际值替换的参数名用下划线标注。

  5. 对于那些有很多选项的,实用程序可以将那些不接受选项参数的的选项放在一个选项组里面,如下所示:

    1
    utility_name [-abcDxyz][-p arg][operand]

    而对于有非常复杂选项的,则经常如下所示:

    1
    utility_name [options][operands]
  6. 当运算对象或者选项参数出现数字时,被当作十进制数字。

  7. 选项或者选项的参数用方括号括起来的,表示可选。

  8. 参数中使用|分开的,表示这些参数是互斥的,同意时刻只能有一个参数被使用。

  9. 运算的对象后面带有**...**省略号的表示一个或者多个operand是被允许的,如果包含在方括号中则是0个或者多个operand是被允许的。

实用程序语法指导方针

请使用下面的函数来处理命令参数。

1
2
3
4
#include <unistd.h>    
int getopt(int argc, char * const argv[], const char *options);
extern int optind, opterr, optopt;
extern char *optarg;
  1. 实用程序名2到9个字母

  2. 实用程序必须使用portable set中指定字符的小写和数字。

  3. 每个选项必须是单个字母,多个数字组成的选项不被允许。

  4. 所有选项前面必须带有横杠-

  5. 选项组最后可以带一个可带选项参数的选项。

  6. 单个选项有多个选项参数时,用逗号分开各个选项.

  7. 在命令行中所有选项必须在运算对象的后面。

  8. The first – argument that is not an option-argument should be accepted as a delimiter indicating the end of options. Any following arguments should be treated as operands, even if they begin with the ‘-‘ character.

  9. ‘-‘作为运算对象时只可以表示为标准输入,或者有说明为标准输出。