为了技术,我不会停下学习的脚步,我相信我还能走二十年。
分类:
2012-07-06 20:27:13
Shell的getopts和C语言的getopt对比
Note:shell的getopts来处理shell脚本命令行参数的的,c语言的getopt函数是处理C程序命令行参数的,刚刚开始的时候我没注意到两者竟然有不同的在处理数据的时候,真亏得我的一个不可失去的好友啊,呵呵。
注意:在shell和c里OPTIND和optind都指向下一个参数的位置
1、 Shell的getopts
#! /bin/bash -
while getopts f:v opt
do
echo $OPTIND
case $opt in
f) echo $OPTARG
echo $OPTIND;;
v)
echo 'no v'
echo $OPTARG;;
?) echo 'error'
echo $OPTARG
esac
done
echo $OPTIND
$./test –f
./test 选项需要一个参数 –f #在getopts f:v情形下系统报错,在getopts :f:v系统不报错
2
error #-f本来应该有选项,但是没有指定,则将opt变量设置成’?’,但是并不把OPTARG
#置成’f’,而是空值NULL
2
$/test –f –v
3
-v#-f有选项,但是不应该是-v,但是shell把-v作为了-f的选项变量即是OPTARG=’-v’
3
3
$/test –v argvother
2
no v#-v没有选项,OPTARG是空值NULL,即使-v后面有内容也不识别为getopts处理的参数
#跳出了getopts的循环
2
#! /bin/bash -
while getopts :f:v opt
do
echo $OPTIND
case $opt in
f) echo $OPTARG
echo $OPTIND;;
v)
echo 'no v'
echo $OPTARG;;
?) echo 'error'
echo $OPTARG
esac
done
echo $OPTIND
$./test –f#在getopts f:v情形下系统报错,在getopts :f:v系统不报错
2
error #-f本来应该有选项,但是没有指定,则将opt变量设置成’?’,把OPTARG
f #置成’f’
2
2、 C语言的getopt
#include
#include
int main(int argc,char *argv[])
{
int ch;
while((ch=getopt(argc,argv,"f:v"))!=-1)
{
printf("optind:%d ",optind);
printf("optarg:%s ",optarg);
printf("ch:%c ",ch);
switch(ch)
{
case 'f':
printf("option f ");
break;
case 'v':
printf("option v ");
break;
case '?':
printf("option ? ");
break;
case ':':
printf("option : ");
break;
}
printf("\n");
}
}
./test –f
./a.out: option requires an argument -- 'f'
optind:2 optarg:(null) ch:? option ?
#-f本来应该有选项,但是没有指定,则将#opt变量设置成’?’,但是并不把OPTARG置成’f’,而是空值NULL
./test –f -v
optind:3 optarg:-v ch:f option f
./test –v otherargv
optind:2 optarg:(null) ch:v option v
#-v没有选项,参数为空
#include
#include
int main(int argc,char *argv[])
{
int ch;
while((ch=getopt(argc,argv,":f:v"))!=-1)
{
printf("optind:%d ",optind);
printf("optarg:%s ",optarg);
printf("ch:%c ",ch);
switch(ch)
{
case 'f':
printf("option f ");
break;
case 'v':
printf("option v ");
break;
case '?':
printf("option ? ");
break;
case ':':
printf("option : ");
break;
}
printf("\n");
}
}
./test –f
optind:2 optarg:(null) ch:: option :
#-f本来应该有选项,但是没有指定,则将#opt变量设置成’:’,但是并不把OPTARG置成’f’,而是空值NULL
总结:-f后需有参数,-v后无参数
加上前缀’:’限制系统自动输出错误信息;
Shell的getopts和C的getopt只在处理错误的时候不一致: -f选项后无参数
(1) shell的getopts在不加前缀冒号(f:v)的时候,opt=?,OPTARG=NULL;报错
(2) shell的getopts在加前缀冒号(:f:v)的时候,opt=?,OPTARG=f;不报错
(3) c的getopt在不加前缀冒号(f:v)的时候,opt=?,OPTARG=NULL;报错
(4) c的getopt在加前缀冒号(:f:v)的时候,opt=:,OPTARG=NULL;不报错
-f后需有参数,-v后无参数: -f 选项后无参数
(5) shell的getopts在不加前缀冒号(f::v)的时候,opt=?,OPTARG=NULL;报错
(6) shell的getopts在加前缀冒号(:f::v)的时候,opt=?,OPTARG=f;不报错
(7) c的getopt在不加前缀冒号(f::v)的时候,opt=f,OPTARG=NULL;不报错
(8) c的getopt在加前缀冒号(:f::v)的时候,opt=f,OPTARG=NULL;不报错
-f后需有参数,-v后无参数 f::v的时候:
(9) -f1 shell的getopts,opt=f,OPTARG=1,OPTIND=2;不报错
(10) -f 1 shell的getopts,opt=f,OPTARG=1, OPTIND=3;不报错
(11) -f1 c的getopt,opt=f,OPTARG=1, OPTIND=2;不报错
(12) -f 1 c的getopt,opt=f,OPTARG=NULL, OPTIND=2;不报错
-f后需有参数,-v后无参数 :f::v的时候:
(13) -f1 shell的getopts,opt=f,OPTARG=1,OPTIND=2;不报错
(14) -f 1 shell的getopts,opt=f,OPTARG=1, OPTIND=3;不报错
(15) -f1 c的getopt,opt=f,OPTARG=1, OPTIND=2;不报错
(16) -f 1 c的getopt,opt=f,OPTARG=NULL, OPTIND=2;不报错
两者一致的:
(1)-f -v会将-v误认为-f的参数;
(2)-v otheratgv,OPTARG=HULL;