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

您當(dāng)前所在位置: 首頁操作系統(tǒng)LINUX → linux命令行參數(shù)編程

linux命令行參數(shù)編程

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

  GNU/Linux的命令行選項(xiàng)有兩種類型:短選項(xiàng)和長選項(xiàng),前者以 '-' 作為前導(dǎo)符,后者以 '--' 作為前導(dǎo)符。比如有一個(gè)命令:

  $ myprog -a vv --add -b --file a.txt b.txt - -- -e c.txt

  在GNU/Linux系統(tǒng),對(duì)這種情況的一種合理解釋是:

  a是短選項(xiàng),帶一個(gè)參數(shù)vv;

  add是長選項(xiàng),無參數(shù);

  b是短選項(xiàng),無參數(shù);

  file是長選項(xiàng),帶一個(gè)參數(shù)a.txt;

  b.txt是參數(shù);

  -是參數(shù),通常表示標(biāo)準(zhǔn)輸入,stdin;

  --是一個(gè)指示符,表明停止掃描參數(shù),其后所有部分都是參數(shù),而不是選項(xiàng);

  -e是參數(shù);

  c.txt是參數(shù)

  為了簡(jiǎn)化程序設(shè)計(jì),有幾個(gè)庫函數(shù)可以優(yōu)雅地分析命令行參數(shù),原型如下:

  #include

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

  const char *optstring);

  extern char *optarg;

  extern int optind, opterr, optopt;

  #define _GNU_SOURCE

  #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ù)的getopt函數(shù)。參數(shù)含義如下:

  argc, argv是從main函數(shù)獲取的參數(shù),原樣傳給getopt;

  optstring指示如何分析參數(shù)。

  關(guān)于optstring,還有幾點(diǎn)說明:

  如果選項(xiàng)帶參數(shù),該選項(xiàng)后接冒號(hào),比如上例中optstring為"a:b",指示a帶參數(shù),b沒有參數(shù);

  如果選項(xiàng)帶可選參數(shù),該選項(xiàng)后接兩個(gè)冒號(hào),比如"a::b",表明a可能有參數(shù),也可能沒有;

  如果optstring的開頭字符為':',表明如果指明選項(xiàng)帶參數(shù),而實(shí)際命令行沒有參數(shù)時(shí),getopt返回':'而不是'?'(默認(rèn)情況下返回'?',和無法識(shí)別的參數(shù)返回一樣);

  如果optstring的開頭字符為'+',表明一但遇到一個(gè)無選項(xiàng)參數(shù),馬上停止掃描,隨后的部分當(dāng)作參數(shù)來解釋;

  如果optstring的開頭字符為'-',表明如果遇到無選項(xiàng)參數(shù),則把它當(dāng)作選項(xiàng)1(不是字符'1')的參數(shù)

  該函數(shù)每解析完一個(gè)選項(xiàng),就返回該選項(xiàng)字符。

  如果選項(xiàng)帶參數(shù),參數(shù)保存在optarg中。如果選項(xiàng)帶可選參數(shù),而實(shí)際無參數(shù)時(shí),optarg為NULL。

  當(dāng)遇到一個(gè)不在optstring指明的選項(xiàng)時(shí),返回字符‘?’。如果在optstring指明某選項(xiàng)帶參數(shù)而實(shí)際沒有參數(shù)時(shí),返回字符‘?’或者字符‘:’,視optstring的第一個(gè)字符而定。這兩種情況選項(xiàng)的實(shí)際值被保存在optopt中。

  當(dāng)解析錯(cuò)誤時(shí),如果opterr為1則自動(dòng)打印一條錯(cuò)誤消息(默認(rèn)),否則不打印。

  當(dāng)解析完成時(shí),返回-1。

  每當(dāng)解析完一個(gè)argv,optind就會(huì)遞增。如果遇到無選項(xiàng)參數(shù),getopt默認(rèn)會(huì)把該參數(shù)調(diào)后一位,接著解析下一個(gè)參數(shù)。如果解析完成后還有無選項(xiàng)的參數(shù),則optind指示的是第一個(gè)無選項(xiàng)參數(shù)在argv中的索引。

  函數(shù)getopt_long()的工作方式類似于getopt(),不過它還能接收長選項(xiàng)。在接收長選項(xiàng)之前,我們必須定義個(gè)一個(gè)結(jié)構(gòu)體數(shù)組變量longopts,指明我們希望獲取的長選項(xiàng)。

  struct option {

  const char *name;

  int has_arg;

  int *flag;

  int val;

  };

  含義如下:

  name指明長選項(xiàng)的名稱;

  has_arg指明該選項(xiàng)是否帶參數(shù),1為是,0為否,2為可選;

  flag指明長選項(xiàng)如何返回,如果flag為NULL,則getopt_long返回val。否則返回0,flag指向一個(gè)值為val的變量。如果該長選項(xiàng)沒有發(fā)現(xiàn),flag保持不變;

  val指明返回的值,或者需要加載到被flag所指示的變量中。

  option數(shù)組的最后一個(gè)元素必須全部填充0.

  getopt_long的最后一個(gè)參數(shù)longindex在函數(shù)返回時(shí)指向被搜索到的選項(xiàng)在longopts數(shù)組中的下標(biāo)。longindex可以為NULL,表明不需要返回這個(gè)值。

  getopt_long_only類似于getopt_long,但是它把'-'開頭的選項(xiàng)當(dāng)作長選項(xiàng)來處理。如果該選項(xiàng)與長選項(xiàng)不匹配,而與短選項(xiàng)匹配,則可以作為短選項(xiàng)解析。

  在短選項(xiàng)找到的時(shí)候,getopt_long和getopt_long_only的表現(xiàn)和getopt一樣。如果長選項(xiàng)找到了,如果flag為 NULL,返回val,否則返回0。錯(cuò)誤情況的處理和getopt一樣,只是返回'?'時(shí)還可能是別的情況引起的:選項(xiàng)含糊不明確或者無關(guān)參數(shù)。

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

  我們拿Linux手冊(cè)的一個(gè)例子來說事。

  #include ???? /* for printf */

  #include ??? /* for exit */

  #include

  int

  main (int argc, char **argv) {

  int c;

  int digit_optind = 0;

  while (1) {

  int this_option_optind = optind ? optind : 1;

  int option_index = 0;

  static struct option long_options[] = {

  {"add", 1, 0, 0},

  {"append", 0, 0, 0},

  {"delete", 1, 0, 0},

  {"verbose", 0, 0, 0},

  {"create", 1, 0, ’c’},

  {"file", 1, 0, 0},

  {0, 0, 0, 0}

  };

  c = getopt_long (argc, argv, "abc:d:012",

  long_options, &option_index);

  if (c == -1)

  break;

  switch (c) {

  case 0:

  printf ("option %s", long_options[option_index].name);

  if (optarg)

  printf (" with arg %s", optarg);

  printf ("\n");

  break;

  case ’0’:

  case ’1’:

  case ’2’:

  if (digit_optind != 0 && digit_optind != this_option_optind)

  printf ("digits occur in two different argv-elements.\n");

  digit_optind = this_option_optind;

  printf ("option %c\n", c);

  break;

  case ’a’:

  printf ("option a\n");

  break;

  case ’b’:

  printf ("option b\n");

  break;

  case ’c’:

  printf ("option c with value ‘%s’\n", optarg);

  break;

  case ’d’:

  printf ("option d with value ‘%s’\n", optarg);

  break;

  case ’?’:

  break;

  default:

  printf ("?? getopt returned character code 0%o ??\n", c);

  }

  }

  if (optind < argc) {

  printf ("non-option ARGV-elements: ");

  while (optind < argc)

  printf ("%s ", argv[optind++]);

  printf ("\n");

  }

  exit (0);

  }

  我們用digit_optind和this_option_optind來跟蹤選項(xiàng)012是否在一起,比如選項(xiàng) -012 和-0 -1 -2 的optind情況是不一樣的,前者返回0、1、2時(shí)optind相同,而后者optind的值依次大1。

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

相關(guān)閱讀

文章評(píng)論
發(fā)表評(píng)論

熱門文章 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程 Tomcat9.0如何安裝_Tomcat9.0環(huán)境變量配置方法 Tomcat9.0如何安裝_Tomcat9.0環(huán)境變量配置方法 多種操作系統(tǒng)NTP客戶端配置 多種操作系統(tǒng)NTP客戶端配置 Linux操作系統(tǒng)修改IP Linux操作系統(tǒng)修改IP

相關(guān)下載

    人氣排行 Linux下獲取CPUID、硬盤序列號(hào)與MAC地址 dmidecode命令查看內(nèi)存型號(hào) linux tc實(shí)現(xiàn)ip流量限制 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程 linux下解壓rar文件 lcx.exe、nc.exe、sc.exe入侵中的使用方法 Ubuntu linux 關(guān)機(jī)、重啟、注銷 命令 查看linux服務(wù)器硬盤IO讀寫負(fù)載