命令行选项的处理

       对命令行的选项的处理有时是一个比较头疼的问题。首先需要从输入中识别出命令行选项来,通过选项的组合出需要调用的具体处理过程。在unix世界中命令行选项有共性,更是千差万别。如果手工去处理我们的方法一般会先进行分词,之后进行词法分析。这个过程的复杂度随着参数数量的增加而增加。     

    int main(int argc, char **argv)
    {
        return 0;
    }
argc记录了参数的个数,argv是输入的字符串。对argv进行分拆使用:

      #include <string.h>
       char *strtok(char *str, const char *delim);
注意strtok会破坏原有字符串的内存,需要对str进行复制一下。每次分拆后strtok的处理节点会下移,可以判断str是否为NULL来结束循环。当然,你也可以使用c++中的std::string的find函数来处理,如果需要更强大点就用boost库的boost::algorithm::split处理吧。原型如下:

namespace boost {
  namespace algorithm {
    template<typename SequenceSequenceT, typename RangeT, typename PredicateT> 
      SequenceSequenceT & 
      split(SequenceSequenceT &, RangeT &, PredicateT, 
            token_compress_mode_type = token_compress_off);
  }
}

还有或者直接用boost::tokenizer,他有一个boost::tokenizer::iterator的迭代器,可以实现对参数的分解。

template <
        class TokenizerFunc = char_delimiters_separator<char>, 
        class Iterator = std::string::const_iterator,
        class Type = std::string
  >
  class tokenizer

这些都需要我们去处理这些过程。不过我们很幸运,getopt能够完成我们需要的这些功能。在bash中getopt是一个外部程序提供了长短选项的支持。通过-o和-l实现对短选项和长选项的处理。

short_options="b:r"
long_options="back:,restore:"

opts=`getopt -o $short_options --long $long_options`

在C中unistd.h和getopt.h分别提供了针对于短选项和长选项的支持。函数原型如下:

       #include <unistd.h>

       int getopt(int argc, char * const argv[], 
                  const char *optstring);
       extern char *optarg;
       extern int optind, opterr, optopt;

       #include <getopt.h>

       int getopt_long(int argc, char * const argv[],
                  const char *optstring,
                  const struct option *longopts, int *longindex);

       int getopt_long_only(int argc, char * const argv[],
                  const char *optstring,
                  const struct option *longopts, int *longindex);

使用如下:

result = getopt(argc, argv, "a:b:");
如果失败result为-1,否则为选项字符,optarg为选项内容,optopt为选项。

第三个参数是选项:

  1. 单个字符,表示选项,
  2. 单个字符后接一个冒号:表示该选项后必须跟一个参数。参数紧跟在选项后或者以空格隔开。该参数的指针赋给optarg。

大部分的语言都内置了getopt的支持,使用方法都差不多,比如python

import getopt,sys
opts, args = getopt.getopt(sys.argv[1:], "ho:", ["help", "output="])  

现在我们很容易的去实现一个程序的入口部分。但是如果我们需要一个交互的CLI界面那就需要readline库来支持了。他会提供包括命令补全,历史记录,shell快捷键支持的相关功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值