当前位置:操作系统 > Unix/Linux >>

LInux程序的命令行处理

几乎所有的GNU/Linux程序都遵循一些同样的命令行解释习惯,程序的参数通常分为了两大类:选项(option)或者一些标志(flag)、其他参数。选项(option)主要是提供给程序一些运行上的选择,而其他参数则通常是提供给程序运行的输入之类的值。按照习惯,选项通常有两种表达形式:

  ¨ 短形式:通常是由一个“-”加上一个字母组合而成。这种形式的好处是输入快捷。

  ¨ 长形式:通常是由两个“-”加上一个单词组合而成。这种形式的好处是形象、好记、直观。

  通常来说,一个程序读于这两种形式都支持。例如大多数的程序都有这样的调用选项:“-h”和“??help”。一些选项需要知道后面跟着的参数,例如“ls ?s /”,这里其中的“/”就是一个参数。

  使用getopt_long函数来处理

  对于一个命令行的分析处理是很单调乏味的工作,需要做大量的诸如字符串的匹配之类的操作,不过幸运的是,GNU C函数库 里面提供了一个函数能够使得这项工作变得容易得多。当然也许仍然没有你想象的那么容易。:))getopt_long这个函数就能够同时“理解”长形式和短形式的参数,需要包括的头文件是

  下面我们通过一个实例来学习这个函数的使用。

  假设我们要编写的一个程序需要处理以下几个参数:

  短形式 长形式 含义

  -h ??help 打印帮助信息

  -s ??server 服务器IP地址

  -b ??background 后台执行

  要使用getopt_long()这个函数,我们需要提供两个数据结构,第一个是一个字符串,该字符串中的每个字符来表示短形式的选项,如果某个选项后面需要跟一个参数,那么就需要在这个字符后面加上一个“:”(冒号),例如“hs:b”就是我们这个例子中的结构。为了定义长形式表达的选项,我们需要定一个结构体数组。数组的每一项与一个长形式的参数相关,每项包括四个参数:通常来说,第一项是长形式的选项的字符串表达;第二项与后面是否有参数提取有关,如果后面有参数需要处理就是1,否则是0;第三项是NULL;最后一项则是与长形式相关联的短形式表达的字符。另外,这个数组的最后一项必须全部置为0。

  根据上面的说明,对于我们的例子,可以得到下面的一个数组:

  const struct option long_options [] =={

  {“help ”,0,NULL,‘h ’ }},

  {“server ”,1,NULL,‘s ’ }},

  {“background”,0,NULL,‘b ’ }},

  {NULL,0,NULL,0 }

  };

  我们把传给main函数的参数给getopt_long,他就一项一项的读取处理,返回短形式表达的选项的字符,如果没有找到选项则返回-1。通常我们都是在一个循环里面反复调用getopt_long,然后通过一个switch语句来处理不同的选项。如果getopt_long遇到一个没有定义的选项,则会返回一个“?”(问号)字符。下面是我们的例子,这是一个很典型的处理过程:

  #include

  #include

  #include

  const char*program_name;

  void print_usage (FILE*stream,int exit_code)

  {

  fprintf (stream,“Usage:%s options [ inputfile ....]

  ”,program_name);

  fprintf (stream,

  “ -h --help Display this usage information.

  ”

  “ -s --server ip Set the server IP.

  ”

  “ -b --background run in the backgound.

  ”);

  exit (exit_code);

  }

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

  {

  int next_option;

  const char*const short_options =“hs:b ”;

  const struct option long_options [] =={

  {“help ”,0,NULL,‘h ’ }},

  {“server”,1,NULL,‘s ’ }},

  {“background ”,0,NULL,‘b ’ }},

  {NULL,0,NULL,0 }

  };

  const char*output_filename =NULL;

  int verbose =0;

  program_name =argv [0 ];

  do {

  next_option =getopt_long (argc,argv,short_options,

  long_options,NULL);

  switch (next_option)

  {

  case ‘h ’:/*-h or --help */

  print_usage (stdout,0);

  case ‘s ’:/*-o or --output */

  //ip =optarg;

  break;

  case ‘b ’:/*-v or --verbose */

  break;

  case ‘?’:/*The user specified an invalid option.*/

  code one (indicating abnormal termination).*/

  print_usage (stderr,1);

  case -1:/*Done with options.*/

  break;

  default:/*Something else:unexpected.*/

  abort ();

  }

  }

  while (next_option !=-1);

  /*The main program goes here.*/

  return 0;

  }

  

上一个:Linux_FAQ之三:系统命令
下一个:扫盲行动之:Linux常用命令简

更多Unix/Linux疑问解答:
路由原理介绍
子网掩码快速算法
改变网络接口的速度和协商方式的工具miitool和ethtool
Loopback口的作用汇总
OSPF的童话
增强的ACL修改功能
三层交换机和路由器的比较
用三层交换机组建校园网
4到7层交换识别内容
SPARC中如何安装Linux系统(2)
SPARC中如何安装Linux系统(1)
用Swatch做Linux日志分析
实战多种Linux操作系统共存
浅析Linux系统帐户的管理和审计
Linux2.6对新型CPU的支持(2)
电脑通通透
玩转网络
IE/注册表
DOS/Win9x
Windows Xp
Windows 2000
Windows 2003
Windows Vista
Windows 2008
Windows7
Unix/Linux
苹果机Mac OS
windows8
安卓/Android
Windows10
如果你遇到操作系统难题:
请访问www.zzzyk.com 试试
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,