Linux中,对于多数程序,都能够接受命令行选项,进行调用交互。具有可靠的复杂命令行参数处理机制,会使得程序健壮性更强,更好用。而getopt()是一个专门设计来处理命令行参数的库函数,简单而易用。
1.命令语法格式
命令的格式:
COMMAND OPTIONS ARGUMENT
命令 选项 参数
COMMAND:本次想要执行的操作,想要发起的进程
内部命令:也叫内建命令或内置命令,直接内建与shell的命令
外部命令:通过安装某些应用程序而安装的命令
OPTIONS:修正命令的执行效果的组成部分
短选项:
-CHAR
-a,-b,-i,…
某些特殊的命令还有特殊的短选项:
+CHAR
+C,…
当同时使用多个短选项时,可以将其合并书写,如:
-a -b -i <=>-abi
长选项:
–WORD
–help,–all,–verbose,–list,…
注意:当一个命令中同时有多个长选项时,不可以合并书写;
注意:
1、有些选项,其选项本身需要参数;
2、有些特殊的命令在写选项时,可以不写“-”;有些特殊的命令,在写选项时,一 定不能写“-”;
3、有些特殊命令的长选项,只能使用一个“-”;
ARGUMENT(PARAMETERS):此次执行命令的操作目标的对象
注意:1、有些命令无须写参数;
2、有些命令必须写参数;
3、有的命令必须写多个参数;
对于整个命令格式:
注意:1.在书写命令格式的时候,COMMAND、OPTIONS、AGUMENT之间必须使用至少一个空白字符进行间隔;
2.有些命令在执行的时候,OPTIONS和AGUMENT可以交换位置;
3.由于文件系统的限制,导致命令中的COMMAND部分、OPTIONS部分、AGUMRNT部分必须区分大小写;
2.基本的命令行处理技术
C 程序通过 argc 和 argv 参数访问它的命令行参数。argc 是整型数,表示参数的个数(包括命令名):
int main(int argc, char*argv[])
{
……
}
当 C 运行时库的程序启动代码调用 main() 时,已经对命令行进行了处理。argc 参数包含参数的计数值,而 argv 包含指向这些参数的指针数组。argv[0]是程序名。
3.命令行参数解析函数(短参数) —— getopt()
Linux下命令行解析函数getopt.
原型:
int getopt(int argc,char *argv[],const char *optstring);
参数:
agrc:命令行参数个数
argv[]:命令行参数数组
optstring:命令行参数选项
getopt调用一次将返回第一个选项,再次调用将返回下一个选项并设置相应的全局变量,不再识别返回-1:
optarg–指向当前选项参数的指针
optind–成功调用一次指向下一个argv指针的索引
optopt–最后一个未知选项,默认为0,出错为出错时的选项
opterr–全局变量默认为1,控制错误信息的输出,改为0则不输出
optstring注意:a: b:c::e
a b c d e表示命令行的 -a -b -c -d -e选项; :和::表示选项后有参数,e后边并没有参数。
:参数在选项后有一个空格或者挨着; ::可省略参数或者参数紧挨着选项 。
#include<stdio.h>
#include<unistd.h>
#include<string.h>
//int opterr=0;//控制错误信息0表示关闭
int main(int argc,char *argv[]){
int ch;
printf("命令行参数个数:argc=%d\n",argc);
for(int i=0;i<argc;i++){
printf("命令行参数:argv[%d]=%s\n",i,argv[i]);
}
ch=getopt(argc,argv,"a:b::c:d");
while(ch!=-1){
switch(ch){
case 'a':printf("选择a选项:ch=%c,optind=%d,optarg=%s,opterr=%d,optopt=%d\n",ch,optind,optarg,opterr,optopt);break;
case 'b':printf("选择b选项:ch=%c,optind=%d,optarg=%s,opterr=%d,optopt=%d\n",ch,optind,optarg,opterr,optopt);break;
case 'c':printf("选择c选项:ch=%c,optind=%d,optarg&