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 ....]\n ”,program_name);
fprintf (stream,
“ -h --help display this usage information.\n ”
“ -s --server ip set the server ip.\n ”
“ -b --background run in the backgound.\n ”);
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;
}
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器