簡體   English   中英

在命令行程序中將選項與非選項參數分開

[英]Seperating options from non-option arguments in a command-line program

我正在嘗試寫ls w /一些選項的有限版本。

但是,我一直堅持以一種干凈的方式從我的論點中解析我的選擇的問題。

例如:

$ ls -l -t somefile anotherFile

$ ls somefile -lt anotherFile

具有相同的行為。

這給我帶來了兩個問題:

  1. 這使使用argc更加困難。 例如,我認為參數ls -ltls都具有0個參數(命令名稱除外),但是argc將-l視為參數。

因此,天真的實現:

if( argc == 1) {list all the contents of cwd}

不起作用。

是否有獲取選項和選項計數的內置方法,還是我必須滾動自己的函數?

  1. 我必須考慮所有不同的方式來排列選項,並且要小心不要混淆選項作為文件名或目錄名。 似乎最干凈的解決方案是從一開始就將選項與文件參數分開。 是否有慣用的方法來做到這一點?是否有標准的庫調用來做到這一點?

沒有內置的參數解析幫助,但是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將:

  1. 舉報l
  2. 報告t
  3. 報告選項(-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM