如何为复杂的命令行选项设计语法?

时间:2016-07-26 17:09:09

标签: c++ c command-line arguments getopt

假设我的命令行实用程序可以发送具有以下结构的消息

struct Message {
    uint32_t ip;
    string id;
}

用户必须能够在ip上指定主机(ipv4 +端口)和过滤器,并且每个主机 (允许发送网络地址和ID)。我该怎么设计 清楚这种复杂选项的语法?

我发明的最好的是:

--msg-send="192.168.10.2:8080;ip_isin=10.0.0.0/8,172.16.0.1/16;id=one,two"

但它有问题......比如里面的标志=是 很烦人...有人知道"银弹"对于具有复杂结构的命令行参数?

另一种变体更好:

--msg-send="192.168.10.2:8080{ip 10.0.0.0/8,172.168.0.0/16}{id one,two}"

UPD: msg-send是复数,用户可以使用不同的过滤器设置多个主机

1 个答案:

答案 0 :(得分:3)

但是,在与人类互动时,你应该尝试遵循人类的思维方式。您试图让用户手动构建一个类似于JSON格式的复杂结构。人类对此不好。从你的解释我得到这个结构有三个组成部分:

  1. 主机+端口
  2. IP列表(由子网标识,CIDR表示法, 游侠,无论你的程序能处理什么)
  3. 字符串ID列表
  4. 因此,要求用户单独输入这些参数可能是合乎逻辑的,例如

    msg_util.exe --host 192.168.10.2:8080 --allowed_ips 10.0.0.0/8,172.16.0.1/16 --allowed_ids one,two
    

    如果您的许多主机可能具有相应的允许IP和ID,那么单独从命令行输入它是非常尴尬的,并且许多网络实用程序(如dig)使用来自文件。例如,您可以

    msg_util.exe --file --host hosts_file --allowed_ips ips_file --allowed_ids ids_file
    

    其中hosts_file的每一行都有ips_fileids_file

    中的转发选项