[英]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.