Shell的getopts和C语言的getopt对比

65 篇文章 1 订阅

ShellgetoptsC语言的getopt对比

 

Note:shellgetopts来处理shell脚本命令行参数的的,c语言的getopt函数是处理C程序命令行参数的,刚刚开始的时候我没注意到两者竟然有不同的在处理数据的时候,真亏得我的一个不可失去的好友啊,呵呵。

 

注意:在shellc里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 <stdio.h>

#include <unistd.h>

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 <stdio.h>

#include <unistd.h>

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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值