我正在为 node.js 使用 optimist,并希望像这样解析输入:
$ command some args -m this is the message
进入这个
{argv:{_:['some','args'],m:'this is the message'}}
乐观主义者有可能吗?这一般可能吗?
我正在为 node.js 使用 optimist,并希望像这样解析输入:
$ command some args -m this is the message
进入这个
{argv:{_:['some','args'],m:'this is the message'}}
乐观主义者有可能吗?这一般可能吗?
通常,shell 负责对包含空格的参数进行分组,而不是参数解析器。这通常是通过用户引用多字参数来完成的(在 Unix 类型的 shell 中使用单引号或双引号,在 Windows 中只能识别双引号)。
在 Optimist 中,您可以执行以下操作:
var argv=require('optimist').argv;
if (argv.m) {
argv.m=argv.m+' '+argv._.join(' ');
}
如果 -m
是最后一个参数,它将按您的预期工作。但是,如果你做了类似的事情command ... -m hello there -q now here
,argv.m
最终会变成“你好”,这可能不是你想要的。
我最终这样做了,这适用于我的用例:
#!/usr/bin/env coffee
args = process.argv
o = {_:[],$0:[]}
flags = {s:'state',m:'message',e:'editor',t:'type'}
i = -2
na = false # next argument: false/opt/flag
for arg in args
if m = arg.match /^--(.+?)(=(.+))?$/
na = m[1]
o[m[1]] = m[3] || true
else if m = arg.match /^-(.+)/
na = flags[m[1]]
o[na] = true
if !na
console.log 'Unknown flag: '+m[1]
process.exit 1
else if ++i > 0 # ignore first two args which are node and app
if na == 'message'
o.message = [arg]
else if na != false
o[na] = arg
else
if o.message
o.message.push arg
else
o._.push arg
na = false
else
o['$0'].push arg
if o.message
o.message = o.message.join ' '
console.log o
其实这种方法还是有问题的。我最终做了其他事情,但仍在寻找更好的解决方案。我想我最终会编写一个小的 peg 解析器来解析我想要的命令行选项。