JavaScript 用Node.js写Shell脚本[译]


Posted in Javascript onSeptember 20, 2012

访问参数
你可以通过process.argv来访问到命令行参数,它是一个包含下列内容的数组:

[ nodeBinary, script, arg0, arg1, ... ]

也就是说,第一个参数是从process.argv[2]开始的,你可以像下面这样遍历所有的参数:

process.argv.slice(2).forEach(function (fileName) { 
... 
});

如果你想对参数做更复杂的处理,可以看一下Node.js模块nomnom和optimist.下面,我们会多次用到文件系统模块:
var fs = require('fs');

读取一个文本文件
如果你的文件不是很大,你可以将整个文件全部读进内存,放到一个字符串中:
var text = fs.readFileSync(fileName, "utf8");

然后,你可以分割这个文本,一行一行的处理.
text.split(/\r?\n/).forEach(function (line) { 
// ... 
});

对于大的文件,你可以使用流来遍历所有的行.mtomis在Stack Overflow上给了一个解决方案.

写入一个文本文件
你可以通过字符串将完整的内容写入一个文件.

fs.writeFileSync(fileName, str, 'utf8');
或者你也可以以增量的方式把字符串写入到流中.

var out = fs.createWriteStream(fileName, { encoding: "utf8" }); 
out.write(str); 
out.end(); // 目前和destroy()和destroySoon()一样

跨平台考虑

决定行终止符.
解决1:读取一个已存在的文件到字符串中,搜索"\r\n",如果找不到就判定行终止符是"\n".

var EOL = fileContents.indexOf("\r\n") >= 0 ? "\r\n" : "\n";

解决2:检测系统平台.所有的Windows平台都返回"win32",64位系统也是.
var EOL = (process.platform === 'win32' ? '\r\n' : '\n')

处理paths

当处理文件系统路径时可以使用path模块.这样可以确保使用了正确的PATH分隔符(Unix上用"/",Windows上用"\").

var path = require('path'); 
path.join(mydir, "foo");

运行脚本
如果你的shell脚本名为myscript.js,那么你可以这样运行它:

node myscript.js arg1 arg2 ...

在Unix上,你可以在脚本的第一行加上一句代码,告诉操作系统应该拿什么程序来解释这个脚本:

#!/usr/bin/env node

你还必须给脚本赋予可执行的权限:

chmod u+x myscript.js
现在脚本可以独立运行了:

./myscript.js arg1 arg2 ...

其他话题

  • 输出到标准输出(stdout): console.log和浏览器中一样.console是一个全局对象,不是一个模块,也就不需要使用require()导入.
  • 读取标准输入(stdin): process.stdin是一个readable stream.process是一个全局对象.
  • 运行shell命令:通过child_process.exec().
相关文章
  1. Tip: load source from a file in the Node.js shell
  2. Execute code each time the Node.js REPL starts
Javascript 相关文章推荐
Jquery中dialog属性小记
Sep 03 Javascript
jQuery之浮动窗口实现代码(两种方法)
Sep 08 Javascript
javascript常用方法、属性集合及NodeList 和 HTMLCollection 的浏览器差异
Dec 25 Javascript
JavaScript传递变量: 值传递?引用传递?
Feb 22 Javascript
jquery 简单应用示例总结
Aug 09 Javascript
HTTP 304错误的详细讲解
Nov 13 Javascript
JS控制一个DIV层在指定时间内消失的方法
Feb 17 Javascript
JavaScript String(字符串)对象的简单实例(推荐)
Aug 31 Javascript
node.js实现微信JS-API封装接口的示例代码
Sep 06 Javascript
推荐10款扩展Web表单的JS插件
Dec 25 Javascript
vue 的 solt 子组件过滤过程解析
Sep 07 Javascript
解决vue 使用axios.all()方法发起多个请求控制台报错的问题
Nov 09 Javascript
一个简单的网站访问JS计数器 刷新1次加1次访问
Sep 20 #Javascript
javascript分页代码(当前页码居中)
Sep 20 #Javascript
javascript获取作用在元素上面的样式属性代码
Sep 20 #Javascript
一个基于jquery的文本框记数器
Sep 19 #Javascript
html中的input标签的checked属性jquery判断代码
Sep 19 #Javascript
基于jquery打造的百分比动态色彩条插件
Sep 19 #Javascript
jQuery Ajax提交表单查询获得数据实例代码
Sep 19 #Javascript
You might like
php使用百度翻译api示例分享
2014/01/31 PHP
PHP实现微信公众平台音乐点播
2014/03/20 PHP
PHP数据库操作四:mongodb用法分析
2017/08/16 PHP
关于laravel 数据库迁移中integer类型是无法指定长度的问题
2019/10/09 PHP
php进程(线程)通信基础之System V共享内存简单实例分析
2019/11/09 PHP
ThinkPHP5.1+Ajax实现的无刷新分页功能示例
2020/02/10 PHP
javascript 原型模式实现OOP的再研究
2009/04/09 Javascript
jQuery live
2009/05/15 Javascript
javascript与webservice的通信实现代码
2010/12/25 Javascript
同一页面多个商品倒计时JS 基于面向对象的javascript
2012/02/16 Javascript
Table冻结表头示例代码
2013/08/20 Javascript
JavaScript实现动态添加,删除行的方法实例详解
2015/07/02 Javascript
jQuery实现的漂亮表单效果代码
2015/08/18 Javascript
详解Javascript函数声明与递归调用
2016/10/22 Javascript
详解vue-cli中模拟数据的两种方法
2018/07/03 Javascript
使用layui 渲染table数据表格的实例代码
2018/08/19 Javascript
解决vue组件props传值对象获取不到的问题
2019/06/06 Javascript
[00:32]2018DOTA2亚洲邀请赛Mineski出场
2018/04/04 DOTA
[51:53]完美世界DOTA2联赛循环赛 LBZS vs DM BO2第二场 11.01
2020/11/02 DOTA
python pickle 和 shelve模块的用法
2013/09/16 Python
python中正则表达式与模式匹配
2019/05/07 Python
Python Excel处理库openpyxl使用详解
2019/05/09 Python
PyTorch基本数据类型(一)
2019/05/22 Python
如何一键升级Python所有包
2020/11/05 Python
不可轻视HTML5!App三年内将被html5顶替彻底消失
2015/11/18 HTML / CSS
乌克兰网上珠宝商店:GoldSoveren
2020/03/31 全球购物
英文版销售经理个人求职信
2013/11/20 职场文书
临床医师专业个人自我评价
2014/01/08 职场文书
师德师风整改措施
2014/10/24 职场文书
幼儿园亲子活动通知
2015/04/24 职场文书
学校捐书活动总结
2015/05/08 职场文书
六一儿童节新闻稿
2015/07/17 职场文书
小学四年级作文之最感动的一件事
2019/11/01 职场文书
SQLServer 日期函数大全(小结)
2021/04/08 SQL Server
vue 自定义的组件绑定点击事件
2022/04/21 Vue.js
pt-archiver 主键自增
2022/04/26 MySQL