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 相关文章推荐
JavaScript的public、private和privileged模式
Dec 28 Javascript
javascript学习笔记(十六) 系统对话框(alert、confirm、prompt)
Jun 20 Javascript
jquery 使用简明教程
Mar 05 Javascript
javascript使用正则控制input输入框允许输入的值方法大全
Jun 19 Javascript
js实现字符串转日期格式的方法
May 20 Javascript
7个去伪存真的JavaScript面试题
Jan 07 Javascript
jQuery取消特定的click事件
Feb 29 Javascript
AngularJS使用ocLazyLoad实现js延迟加载
Jul 05 Javascript
基于JavaScript实现多级菜单效果
Jul 25 Javascript
jQuery Ajax向服务端传递数组参数值的实例代码
Sep 03 jQuery
微信小程序项目实践之主页tab选项实现
Jul 18 Javascript
微信小程序如何修改本地缓存key中单个数据的详解
Apr 26 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冒泡排序、快速排序、快速查找、二维数组去重实例分享
2014/04/24 PHP
smarty自定义函数htmlcheckboxes用法实例
2015/01/22 PHP
MacOS 安装 PHP的图片裁剪扩展Tclip
2015/03/25 PHP
PHP十六进制颜色随机生成器功能示例
2017/07/24 PHP
深入理解PHP中mt_rand()随机数的安全
2017/10/12 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
2020/03/27 PHP
javascript学习笔记(七)利用javascript来创建和存储cookie
2011/04/08 Javascript
js判断一个元素是否为另一个元素的子元素的代码
2012/03/21 Javascript
javascript实现单击和双击并存的方法
2014/12/13 Javascript
jQuery学习笔记之Ajax用法实例详解
2015/12/01 Javascript
限制复选框最多选择项的实现代码
2016/05/30 Javascript
AngularJS过滤器filter用法总结
2016/12/13 Javascript
jQuery实现获取隐藏div高度的方法示例
2017/02/09 Javascript
Angular 输入框实现自定义验证功能
2017/02/19 Javascript
js实现动态显示时间效果
2017/03/06 Javascript
ES6新特性之模块Module用法详解
2017/04/01 Javascript
jQuery md5加密插件jQuery.md5.js用法示例
2018/08/24 jQuery
Python查询阿里巴巴关键字排名的方法
2015/07/08 Python
Python实现上下班抢个顺风单脚本
2018/02/07 Python
Python获取昨天、今天、明天开始、结束时间戳的方法
2018/06/01 Python
python绘制多个曲线的折线图
2020/03/23 Python
python matplotlib实现双Y轴的实例
2019/02/12 Python
Python 正则表达式 re.match/re.search/re.sub的使用解析
2019/07/22 Python
在Python中用GDAL实现矢量对栅格的切割实例
2020/03/11 Python
函数指针的定义是什么
2016/08/14 面试题
公司董事长职责
2013/12/12 职场文书
外贸业务员工作职责
2014/01/06 职场文书
办理居住证介绍信
2014/01/15 职场文书
教育科研先进个人材料
2014/01/26 职场文书
幼儿园中秋节活动方案2013
2014/01/29 职场文书
大学生自我鉴定书
2014/03/24 职场文书
我的长生果教学反思
2014/04/28 职场文书
文明村镇申报材料
2014/05/06 职场文书
美国留学经济担保书
2014/05/20 职场文书
三月学雷锋活动总结
2014/06/26 职场文书
浅谈Nginx 中的两种限流方式
2021/03/31 Servers