热烈祝贺台州朗动科技的站长论坛隆重上线!(2012-05-28)    热烈庆祝伟大的祖国60周年生日 点击进来我们一起为她祝福吧(2009-09-26)    站长论坛禁止发布广告,一经发现立即删除。谢谢各位合作!.(2009-08-08)    热烈祝贺台州网址导航全面升级,全新版本上线!希望各位一如既往地支持台州网址导航的发展.(2009-03-28)    台州站长论坛恭祝各位新年快乐,牛年行大运!(2009-01-24)    台州Link正式更名为台州网址导航,专业做以台州网址为主的网址导航!(2008-05-23)    热烈祝贺台州Link资讯改名为中国站长资讯!希望在以后日子里得到大家的大力支持和帮助!(2008-04-10)    热烈祝贺台州Link论坛改名为台州站长论坛!希望大家继续支持和鼓励!(2008-04-10)    台州站长论坛原[社会琐碎]版块更名为[生活百科]版块!(2007-09-05)    特此通知:新台州站长论坛的数据信息全部升级成功!">特此通知:新台州站长论坛的数据信息全部升级成功!(2007-09-01)    台州站长论坛对未通过验证的会员进行合理的清除,请您谅解(2007-08-30)    台州网址导航|上网导航诚邀世界各地的网站友情链接和友谊联盟,共同引领网站导航、前进!(2007-08-30)    禁止发广告之类的帖,已发现立即删除!(2007-08-30)    希望各位上传与下载有用资源和最新信息(2007-08-30)    热烈祝贺台州站长论坛全面升级成功,全新上线!(2007-08-30)    
便民网址导航,轻松网上冲浪。
台州维博网络专业开发网站门户平台系统
您当前的位置: 首页 » Linux编程开发 » Linux操作系统的程序命令行处理分析

Linux操作系统的程序命令行处理分析

论坛链接
  • Linux操作系统的程序命令行处理分析
  • 发布时间:2007-09-09 23:05:57    浏览数:8742    发布者:lupd    设置字体【   
GNU/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;
}


2007-1-31 10:46 #1
娱乐休闲专区A 影视预告B 音乐咖啡C 英语阶梯D 生活百科
网页编程专区E AMPZF HTMLG CSSH JSI ASPJ PHPK JSPL MySQLM AJAX
Linux技术区 N 系统管理O 服务器架设P 网络/硬件Q 编程序开发R 内核/嵌入
管理中心专区S 发布网址T 版主议事U 事务处理