視頻課程:帶你入門Nodejs,說起了很是多的後端知識點javascript
npm Resource: html
npm模塊管理器【阮一峯】java
npm.com【官網】node
從這裏開始:Node.js 命令行程序開發教程git
讀取 - 讀取用戶輸入,解析輸入了Javascript 數據結構並存儲在內存中。shell
執行 - 執行輸入的數據結構npm
打印 - 輸出結果json
循環 - 循環操做以上步驟直到用戶兩次按下 ctrl-c 按鈕退出。後端
$ ./hello hello world
//更爲簡單的執行
$ hello
hello world
執行步驟:bash
Step 1, 在當前目錄下新建 package.json
{ "name": "hello", "bin": { "hello": "hello" } }
$ npm linkStep 2, run this.
process.argv[...] 獲取參數。
#!/usr/bin/env node console.log('hello ', process.argv[2]);
child_process模塊:node.js是基於單線程模型架構,這樣的設計能夠帶來高效的CPU利用率,可是沒法卻利用多個核心的CPU,爲了解決這個問題,node.js提供了child_process模塊。
#!/usr/bin/env node var name = process.argv[2]; var exec = require('child_process').exec; var child = exec('echo hello ' + name, function(err, stdout, stderr) { if (err) throw err; console.log(stdout); });
Shell的調用
安裝 ---->
npm install --save shelljs
shelljs 模塊:從新包裝了 child_process,調用系統命令更加方便。它須要安裝後使用。
#!/usr/bin/env node var name = process.argv[2]; var shell = require("shelljs"); shell.exec("echo hello " + name); // 非全局模式,有點是函數模式
全局模式:容許直接在腳本中寫 shell 命令。
require('shelljs/global'); if (!which('git')) { echo('Sorry, this script requires git'); exit(1); } mkdir('-p', 'out/Release'); cp('-R', 'stuff/*', 'out/Release'); cd('lib'); ls('*.js').forEach(function(file) { sed('-i', 'BUILD_VERSION', 'v0.1.2', file); sed('-i', /.*REMOVE_THIS_LINE.*\n/, '', file); sed('-i', /.*REPLACE_LINE_WITH_MACRO.*\n/, cat('macro.js'), file); }); cd('..'); if (exec('git commit -am "Auto-commit"').code !== 0) { echo('Error: Git commit failed'); exit(1); }
Shell的參數處理
安裝 ---->
$ npm install --save yargs
yargs 模塊:yargs 模塊可以解決如何處理命令行參數
#!/usr/bin/env node var argv = require('yargs').argv; console.log('hello ', argv.name);
方便提取參數。
$ hello --name=tom hello tom $ hello --name tom hello tom
進一步,支持多個別名(短參數,長參數)。
#!/usr/bin/env node var argv = require('yargs') .alias('n', 'name') # 指定 name 是 n 的別名 .argv; console.log('hello ', argv.n);
更爲奇巧的,console.log(argv._)
,能夠獲取非連詞線開頭的參數。
$ hello A -n tom B C hello tom [ 'A', 'B', 'C' ]
更多參數處理選項
#!/usr/bin/env node var argv = require('yargs') .demand(['n']) // n參數不可省略 .default({n: 'tom'}) // 且默認值爲tom .describe({n: 'your name'}) .argv; console.log('hello ', argv.n);
options 方法容許將全部這些配置寫進一個對象,{ }內就不用再寫那麼多重複的"n"了。
#!/usr/bin/env node var argv = require('yargs') .option('n', { alias : 'name', demand: true, default: 'tom', describe: 'your name', type: 'string' }) .argv; console.log('hello ', argv.n);
判斷有沒有該參數
能夠用 boolean 方法指定這些參數返回布爾值。
#!/usr/bin/env node var argv = require('yargs') .boolean(['n']) .argv; console.log('hello ', argv.n);
有該參數,返回true;不然,返回false。
$ hello hello false $ hello -n hello true $ hello -n tom hello true
boolean 方法也能夠做爲屬性,寫入 option 對象。
#!/usr/bin/env node var argv = require('yargs') .option('n', { boolean: true }) .argv; console.log('hello ', argv.n);
幫助信息
yargs 模塊提供如下方法,生成幫助信息。
usage: 用法格式
example:提供例子
help: 顯示幫助信息
epilog: 出如今幫助信息的結尾
但願達到的效果:
$ hello -h Usage: hello [options] Options: -f, --name your name [string] [required] [default: "tom"] -h, --help Show help [boolean] Examples: hello -n tom say hello to Tom copyright 2015
實現方式:
#!/usr/bin/env node var argv = require('yargs') .option('f', { alias : 'name', demand: true, default: 'tom', describe: 'your name', type: 'string' }) .usage('Usage: hello [options]') .example('hello -n tom', 'say hello to Tom') .help('h') .alias('h', 'help') .epilog('copyright 2015') .argv; console.log('hello ', argv.n);
子命令
yargs 模塊還容許經過 command 方法,設置 Git 風格的子命令。
$ hello morning -n tom Good Morning hello tom
實現方式就是使用兩次command(...),或者再與 shellojs 模塊結合起來
#!/usr/bin/env node require('shelljs/global');
var argv = require('yargs') .command("morning", "good morning", function (yargs) { echo("Good Morning"); }) .command("evening", "good evening", function (yargs) { echo("Good Evening"); }) .argv; console.log('hello ', argv.n);
子命令設置各自的參數形式:
每一個子命令每每有本身的參數,這時就須要在回調函數中單獨指定。回調函數中,要先用 reset 方法重置 yargs 對象。
#!/usr/bin/env node require('shelljs/global');
var argv = require('yargs') .command("morning", "good morning", function (yargs) { echo("Good Morning");
var argv = yargs.reset() .option("m", { alias: "message", description: "provide any sentence" }) .help("h") .alias("h", "help") .argv; echo(argv.m); }) .argv;
用法以下:
$ hello morning -m "Are you hungry?"
Good Morning
Are you hungry?
(1)返回值
根據 Unix 傳統,程序執行成功返回 0,不然返回 1 。
if (err) { process.exit(1); } else { process.exit(0); }
(2)重定向
Unix 容許程序之間使用管道重定向數據。
$ ps aux | grep 'node'
腳本能夠經過監聽標準輸入的data 事件,獲取重定向的數據。
process.stdin.resume(); process.stdin.setEncoding('utf8'); process.stdin.on('data', function(data) { process.stdout.write(data); });
下面是用法。
$ echo 'foo' | ./hello hello foo
(3)系統信號
操做系統能夠向執行中的進程發送信號,process 對象可以監聽信號事件。
process.on('SIGINT', function () { console.log('Got a SIGINT'); process.exit(0); });
發送信號的方法以下。
$ kill -s SIGINT [process_id]