首页 javascript基础-minimist命令行参数解析
文章
取消

javascript基础-minimist命令行参数解析

前言

  因为要写一个命令行小工具,不打算弄得太麻烦,只是简单的通过一个命令和几个参数就足够了,为了简单,选择用nodejs来做,只是一个辅助小功能而已。

  因为要接受参数,起初只是通过process.argv获取参数,这个比较简单,按照参数个数逐个获取就可以了,但是使用起来发现有些问,因为这些参数是可以省略的,只需要按照需要传入就可以,这样就会造成参数位置不确定,这就需要更多的处理。

  理想的形式是:命令 -a 值 -b 值 -c 值 --par 值

  按照这个想法在网上找了一下(这个简单要求应该是有现成的包的),就找到了minimist

安装

1
npm install minimist

使用

1
2
3
4
5
6
// 完整参数
// var argv = require('minimist')(process.argv);

//需要的参数
var argv = require('minimist')(process.argv.slice(2));
console.dir(argv);
1
node index2.js aa bb cc -h --help -a=1 -b 2 --test 123 --dev=456 --arr 123 --arr=456
1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
  _: [
    'aa',
    'bb',
    'cc'
  ],
  h: true,
  help: true,
  a: 1,
  b: 2,
  test: 123,
  dev: 456,
  arr: [ 123, 456 ]
}

  通过上面的测试完全满足我的需要,可以看到他只是对process.argv接收的参数进行解析。解析结果是一个对象:

  • 没有中划线的参数以数组的形式在_这个key中。
  • 中划线的短参数(-)或者双中划线的长参数(--)都是以参数名为key的。设置两次就以数组形式存在
  • 其实他没有长参数和短参数的区别,只是简单分开
  • 如果参数后面没有值,则表示是boolean类型

参数类型

  开发的时候还是发现有些小问题,主要是参数的类型,经查看代码发现它有第二个参数,而这个参数恰恰是用来约束参数类型的。

1
2
3
4
5
6
7
const options = {
    string: ["dir", "d", "word", "w", "to", "t"],
    number: ["resize", "r"],
    boolean: ["help", "h"],
}

const argv = require('minimist')(process.argv.slice(2), options);

  通过上面的参数类型约束,可以更好的处理参数。

注:我需要这个参数约束的原因是因为上面的dir参数,这是一个目录,但是我的目录名是包括001这样的目录,总被转化为数字,导致找不到对应目录。

别名

  再仔细研究一下发现,minimist也有别名功能,设置也很简单

1
2
3
4
5
6
7
8
9
10
const options = {
    string: ["dir", "d", "word", "w", "to", "t"],
    boolean: ["help", "h"],
    alias:{ "dir":"d","word":"w","to":"t" ,"help":"h"}
}

var argv = require('minimist')(process.argv,options);
console.dir(argv);

1
node index3.js -w a --word aaa -d b --dir bbbb -h --help -t c --to cccc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
  _: [
    '/usr/local/bin/node',
    '/Users/mmy83/workspace/node/cmd/index3.js'
  ],
  help: true,
  h: true,
  w: [ 'a', 'aaa' ],
  word: [ 'a', 'aaa' ],
  d: [ 'b', 'bbbb' ],
  dir: [ 'b', 'bbbb' ],
  t: [ 'c', 'cccc' ],
  to: [ 'c', 'cccc' ]
}

  会发现设置了别名后,参数的数值是关联的,不再是没有任何关系而独立解析的。

本文由作者按照 CC BY 4.0 进行授权

java基础-Thread类

java基础-synchronized实现原理