2013-08-31 51 views
0

我正在制作一个程序,它接受像--version,--download这样的命令行参数。命令行选项的不同顺序影响我的输出

当我这样做:

$program --version --download file 

程序输出版本和下载文件。但是,当我这样做:

$program --download --version file 

程序认为--version是参数--download

我已经使用getopt_long()函数来解析命令行参数。下面是我的代码片段:

while ((ch = getopt_long(argc, argv, "d:g:hv", longoptions, &optindex)) != -1) 
{ 
    switch(ch) 
    { 
      case 'd' : 
       if (optarg) 
        printf("Downloading %s...\n" , optarg); 
       iso(optarg); 
       break ; 

      case 'g' : 
       if (optarg) 
        printf("Downloading glug-mirror automation script for %s ...\n", optarg); 
       getscript(optarg); 
       break ; 

      case 'v' : 
       printf("glug version 1.0.0 (NIT Hamirpur)\n"); 
       break ; 

      case 'h' : 
       usage(status); 
       break ; 

      default : 
       status = 2 ; 
       usage(status); 
    } 
} 

回答

4

getoptlong()是做什么是应该做的。

  • 格式串"d:g:hv"意味着参数dg需要的值。
  • 在命令行参数后面指定的任何内容都会被视为传递给它的值。

您应该运行您的程序作为

$program --download file --version 

结帐这个detailed example演示使用getoptlong()的各个方面。


如何rm可以处理它的CMD线则params的不同位置?

显然是因为rm的参数(rv等),不接受任何值作为参数。因此directory不会传递给它们中的任何一个,而是独立的cmd行参数。您可以从source-code of rm确认这一点。

要做到为你的程序类似的东西,你将需要修改optstring以"dghv"和处理参数"file"分开。

+0

rm命令可以使用这样的: RM -rv目录 RM -r目录-v RM -vr目录 RM-RV目录 ,所以我想我的程序是这么多灵活.... –

+0

'rm'通过将'directory'作为一个单独的参数来处理; **不是**与任何其他cmd行参数相关的值。用相同的细节更新答案。 – TheCodeArtist