命令列選項的處理

來源:互聯網
上載者:User

       對命令列的選項的處理有時是一個比較頭疼的問題。首先需要從輸入中識別出命令列選項來,通過選項的組合出需要調用的具體處理過程。在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,sysopts, args = getopt.getopt(sys.argv[1:], "ho:", ["help", "output="])  

現在我們很容易的去實現一個程式的入口部分。但是如果我們需要一個互動的CLI介面那就需要readline庫來支援了。他會提供包括命令補全,記錄,shell快速鍵支援的相關功能。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.