[英]Seperating options from non-option arguments in a command-line program
我正在尝试写ls w /一些选项的有限版本。
但是,我一直坚持以一种干净的方式从我的论点中解析我的选择的问题。
例如:
$ ls -l -t somefile anotherFile
$ ls somefile -lt anotherFile
具有相同的行为。
这给我带来了两个问题:
ls -lt
和ls
都具有0个参数(命令名称除外),但是argc将-l
视为参数。 因此,天真的实现:
if( argc == 1) {list all the contents of cwd}
不起作用。
是否有获取选项和选项计数的内置方法,还是我必须滚动自己的函数?
没有内置的参数解析帮助,但是getopt是用于参数解析的“标准”方法。
对于简单的应用程序,有时我会自己添加类似的内容:
int pos=0;
argc--;argv++;
while (argc > 0) {
if (*argv[0]=='-') {
switch ((*argv)[1]) {
case 'l': //-l argument
save_option_l(++argv);
argc--; //we consumed one name
break;
//... other -options here ...
default:
usage("unrecognized option %s", *argv);
}
}
else {
save_positional_argument(argv,pos++);
}
argv++;
argc--;
}
在这种情况下,我要求修饰符直接跟随标志。 不像第一个示例那样支持变量用法,除非有充分的理由这样做。
如果您有Gnu的getopt
实现,它将为您完成所有操作。
当Posix标准getopt
遇到第一个非选项参数时,它将终止选项处理。 这符合Posix实用程序参数解析的准则,我们中的许多人都喜欢这种行为。 但是其他功能喜欢混合选项和非选项的功能,这是Gnu实用程序的标准,除非您使用一个笨拙的名称POSIXLY_CORRECT
设置环境变量。
与该首选项一致,Gnu getopt
解析参数:
缺省是在扫描argv时对其内容进行置换,以便最终所有非选项都在末尾。 这允许以任何顺序给出选项,即使对于未编写程序的程序也是如此。
请注意有关置换参数的措辞。 这意味着如果您从
ls somefile -lt anotherFile
Gnu getopt
将:
l
t
报告选项(-1)的optind
,现在将optind
为2, argv
如下所示:
ls -lt somefile anotherFile
因此,现在您可以使用以下命令处理非选项参数:
for (int argno = optind; argno < argc; ++argno) {
/* Do something with argv[argno] */
}
另外,您可以使用argc-optind
告诉您接收了多少个非选项参数,如果argc == optind
,您知道没有任何参数。
将-lt
捆绑为两个选项是标准的Posix getopt behaviour
。 您可以组合选项石灰,只要第一个不带参数即可。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.