IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機(jī)版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當(dāng)前所在位置: 首頁操作系統(tǒng)windows → linux 中解析命令行參數(shù)(getopt_long用法)

linux 中解析命令行參數(shù)(getopt_long用法)

時(shí)間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評論(1)

  getopt_long支持長選項(xiàng)的命令行解析,使用man getopt_long,得到其聲明如下:

  #include

  int getopt_long(int argc, char * const argv[],

  const char *optstring,

  const struct option *longopts, int *longindex);

  int getopt_long_only(int argc, char * const argv[],

  const char *optstring,

  const struct option *longopts, int *longindex);

  說明:函數(shù)中的argc和argv通常直接從main()到兩個(gè)參數(shù)傳遞而來。optsting是選項(xiàng)參數(shù)組成的字符串,如果該字符串里任一字母后有冒號,那么這個(gè)選項(xiàng)就要求有參數(shù)。下一個(gè)參數(shù)是指向數(shù)組的指針,這個(gè)數(shù)組是option結(jié)構(gòu)數(shù)組,option結(jié)構(gòu)稱為長選項(xiàng)表,其聲明如下:

  struct option {

  const char *name;

  int has_arg;

  int *flag;

  int val;

  };

  結(jié)構(gòu)中的元素解釋如下:

  const char *name:選項(xiàng)名,前面沒有短橫線。譬如"help"、"verbose"之類。

  int has_arg:描述長選項(xiàng)是否有選項(xiàng)參數(shù),如果有,是哪種類型的參數(shù),其值見下表:

  符號常量 數(shù)值????? 含義

  no_argument????? 0????? 選項(xiàng)沒有參數(shù)

  required_argument????? 1????? 選項(xiàng)需要參數(shù)

  optional_argument????? 2????? 選項(xiàng)參數(shù)是可選的

  int *flag:

  如果該指針為NULL,那么getopt_long返回val字段的值;

  如果該指針不為NULL,那么會使得它所指向的結(jié)構(gòu)填入val字段的值,同時(shí)getopt_long返回0

  int val:

  如果flag是NULL,那么val通常是個(gè)字符常量,如果短選項(xiàng)和長選項(xiàng)一致,那么該字符就應(yīng)該與optstring中出現(xiàn)的這個(gè)選項(xiàng)的參數(shù)相同;

  最后一個(gè)參數(shù):longindex參數(shù)一般賦為NULL即可;如果沒有設(shè)置為NULL,那么它就指向一個(gè)變量,這個(gè)變量會被賦值為尋找到的長選項(xiàng)在longopts中的索引值,這可以用于錯(cuò)誤診斷。

  注:GNU提供的getopt-long()和getopt-long-only()函數(shù),其中,后者的長選項(xiàng)字串是以一個(gè)短橫線開始的,而非一對短橫線。

linux 命令行約定:

  幾乎所有的GNU/Linux程序都遵循一些命令行參數(shù)定義的約定。程序希望出現(xiàn)的參數(shù)可以分成兩種:選項(xiàng)(options or flags)、其他類型的的參數(shù)。Options修飾了程序運(yùn)行的方式,其他類型的參數(shù)則提供了輸

  入(例如,輸入文件的名稱)。

  對于options類型參數(shù)可以有兩種方式:

  1)短選項(xiàng)(short options):顧名思義,就是短小參數(shù)。它們通常包含一個(gè)連字號和一個(gè)字母(大寫或小寫字母)。例如:-s,-h等。

  2)長選項(xiàng)(long options):長選項(xiàng),包含了兩個(gè)連字號和一些大小寫字母組成的單詞。例如,--size,--help等。

  *注:一個(gè)程序通常會提供包括short options和long options兩種參數(shù)形式的參數(shù)。

  對于其他類型參數(shù)的說明:

  這種類型的參數(shù),通常跟隨在options類型參數(shù)之后。例如,ls –s /功能為顯示root目錄的大小?!? ’這個(gè)參數(shù)告訴ls要顯示目錄的路徑。

  getopt_long()函數(shù)使用規(guī)則:

 ?。?)使用前準(zhǔn)備兩種數(shù)據(jù)結(jié)構(gòu)

  字符指針型變量

  該數(shù)據(jù)結(jié)構(gòu)包括了所有要定義的短選項(xiàng),每一個(gè)選項(xiàng)都只用單個(gè)字母表示。如果該選項(xiàng)需要參數(shù)(如,需要文件路徑等),則其后跟一個(gè)冒號。例如,三個(gè)短選項(xiàng)分別為‘-h’‘-o’‘-v’,其中-o需要參數(shù),其他兩個(gè)不需要參數(shù)。那么,我們可以將數(shù)據(jù)結(jié)構(gòu)定義成如下形式:

  const char * const shor_options = "ho:v" ;

  struct option 類型數(shù)組

  該數(shù)據(jù)結(jié)構(gòu)中的每個(gè)元素對應(yīng)了一個(gè)長選項(xiàng),并且每個(gè)元素是由四個(gè)域組成。通常情況下,可以按以下規(guī)則使用。第一個(gè)元素,描述長選項(xiàng)的名稱;第二個(gè)選項(xiàng),代表該選項(xiàng)是否需要跟著參數(shù),需要參數(shù)則為1,反之為0;第三個(gè)選項(xiàng),可以賦為NULL;第四個(gè)選項(xiàng),是該長選項(xiàng)對應(yīng)的短選項(xiàng)名稱。另外,數(shù)據(jù)結(jié)構(gòu)的最后一個(gè)元素,要求所有域的內(nèi)容均為0,即{NULL,0,NULL,0}。下面舉例說明,還是按照短選項(xiàng)為‘-h’‘-o’

  ‘-v’的例子,該數(shù)據(jù)結(jié)構(gòu)可以定義成如下形式:

  const struct option long_options = {

  {? "help",????? 0,?? NULL,?? ‘h’? },

  {? "output",??? 1,?? NULL,?? ‘o’? },

  {? "verbose",?? 0,?? NULL,?? ‘v’? },

  {? NULL,????? 0,??? NULL,?? 0? }

  };

 ?。?)調(diào)用方法

  參照(1)準(zhǔn)備的兩個(gè)數(shù)據(jù)結(jié)構(gòu),則調(diào)用方式可為:

  getopt_long( argc, argv, short_options, long_options, NULL);

#p#副標(biāo)題#e#

 ?。?)幾種常見返回值

  (a)每次調(diào)用該函數(shù),它都會分析一個(gè)選項(xiàng),并且返回它的短選項(xiàng),如果分析完畢,即已經(jīng)沒有選項(xiàng)了,則會返回-1。

  (b)如果getopt_long()在分析選項(xiàng)時(shí),遇到一個(gè)沒有定義過的選項(xiàng),則返回值為‘?’,此時(shí),程序員可以打印出所定義命令行的使用信息給用戶。

  (c)當(dāng)處理一個(gè)帶參數(shù)的選項(xiàng)時(shí),全局變量optarg會指向它的參數(shù)

  (d)當(dāng)函數(shù)分析完所有參數(shù)時(shí),全局變量optind(into argv)會指向第一個(gè)‘非選項(xiàng)’的位置實(shí)踐小例子:

  view plaincopy to clipboardprint?

  #include

  #include

  char *l_opt_arg;

  char* const short_options = "nbl:";

  struct option long_options[] = {

  { "name",???? 0,?? NULL,??? 'n'???? },

  { "bf_name",? 0,?? NULL,??? 'b'???? },

  { "love",???? 1,?? NULL,??? 'l'???? },

  {????? 0,???? 0,???? 0,???? 0},

  };

  int main(int argc, char *argv[])

  {

  int c;

  while((c = getopt_long (argc, argv, short_options, long_options, NULL)) != -1)

  {

  switch (c)

  {

  case 'n':

  printf("My name is XL.\n");

  break;

  case 'b':

  printf("His name is ST.\n");

  break;

  case 'l':

  l_opt_arg = optarg;

  printf("Our love is %s!\n", l_opt_arg);

  break;

  }

  }

  return 0;

  }

  #include

  #include

  char *l_opt_arg;

  char* const short_options = "nbl:";

  struct option long_options[] = {

  { "name",???? 0,?? NULL,??? 'n'???? },

  { "bf_name",? 0,?? NULL,??? 'b'???? },

  { "love",???? 1,?? NULL,??? 'l'???? },

  {????? 0,???? 0,???? 0,???? 0},

  };

  int main(int argc, char *argv[])

  {

  int c;

  while((c = getopt_long (argc, argv, short_options, long_options, NULL)) != -1)

  {

  switch (c)

  {

  case 'n':

  printf("My name is XL.\n");

  break;

  case 'b':

  printf("His name is ST.\n");

  break;

  case 'l':

  l_opt_arg = optarg;

  printf("Our love is %s!\n", l_opt_arg);

關(guān)鍵詞標(biāo)簽:linux

相關(guān)閱讀

文章評論
發(fā)表評論

熱門文章 如何修改服務(wù)器3389端口 如何修改服務(wù)器3389端口 Win11系統(tǒng)怎么設(shè)置中文-Win11更改成中文的方法教程 Win11系統(tǒng)怎么設(shè)置中文-Win11更改成中文的方法教程 Win11怎么設(shè)置同步時(shí)間-Win11手動同步時(shí)間操作方法 Win11怎么設(shè)置同步時(shí)間-Win11手動同步時(shí)間操作方法 Win11怎么在開始菜單添加快捷方式-開始菜單添加快捷方式操作方法 Win11怎么在開始菜單添加快捷方式-開始菜單添加快捷方式操作方法

相關(guān)下載

    人氣排行 [聲音故障]XP沒有聲音,丟失Windows Audio服務(wù)(AudioSrv)[警告:2003不一定適用 解決Windows 7黑屏的有效方法 windows2003中關(guān)于軟路由設(shè)置方法的具體介紹 Windows不能在本地計(jì)算機(jī)啟動OracleDBConsoleorcl 一個(gè)空文件夾刪不掉的解決辦法 微軟Windows錯(cuò)誤代碼大全(2) 用Windows命令行實(shí)現(xiàn)自動SSH代理 Windows 7加XP的局域網(wǎng)搭建與文件共享