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 相关文章推荐
网页里控制图片大小的相关代码
Jun 25 Javascript
Javascript 两个窗体之间传值实现代码
Sep 25 Javascript
JavaScript DOM学习第四章 getElementByTagNames
Feb 19 Javascript
不用锚点也可以平滑滚动到页面的指定位置实现代码
May 08 Javascript
jQuery实现文件上传进度条特效
Aug 12 Javascript
js实现新年倒计时效果
Dec 10 Javascript
深入浅析JavaScript函数前面的加号和叹号
Jul 09 Javascript
功能强大的Bootstrap使用手册(一)
Aug 02 Javascript
jquery移除了live()、die(),新版事件绑定on()、off()的方法
Oct 26 Javascript
JS实现简单获取最近7天和最近3天日期的方法
Apr 18 Javascript
Vue动态组件和异步组件原理详解
May 06 Javascript
Vue使用NProgress的操作过程解析
Oct 10 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 include和require的区别深入解析
2013/06/17 PHP
PHP使用内置函数file_put_contents写入文件及追加内容的方法
2015/12/07 PHP
yii框架redis结合php实现秒杀效果(实例代码)
2017/10/26 PHP
在线编辑器中换行与内容自动提取
2009/04/24 Javascript
JavaScript 异步调用框架 (Part 1 - 问题 & 场景)
2009/08/03 Javascript
javascript中RegExp保留小数点后几位数的方法分享
2013/08/13 Javascript
php中给js数组赋值方法
2014/03/10 Javascript
JS选中checkbox后获取table内一行TD所有数据的方法
2015/07/01 Javascript
AngularJS 中的指令实践开发指南(一)
2016/03/20 Javascript
JS之获取样式的简单实现方法(推荐)
2016/09/13 Javascript
etmvc+jQuery EasyUI+combobox多值操作实现角色授权实例
2016/11/09 Javascript
JavaScript创建对象的七种方式(推荐)
2017/06/26 Javascript
详解Vue2.0组件的继承与扩展
2018/11/23 Javascript
微信小程序页面间值传递的两种方法
2018/11/26 Javascript
微信小程序一周时间表功能实现
2019/10/17 Javascript
微信小程序实现搜索框功能及踩过的坑
2020/06/19 Javascript
关于javascript中的promise的用法和注意事项(推荐)
2021/01/15 Javascript
在Python中操作列表之list.extend()方法的使用
2015/05/20 Python
Python实现批量修改文件名实例
2015/07/08 Python
浅谈python3发送post请求参数为空的情况
2018/12/28 Python
Python count函数使用方法实例解析
2020/03/23 Python
医学护理毕业生自荐信
2013/11/07 职场文书
机械设计职业生涯规划书
2013/12/27 职场文书
学生手册家长评语
2014/02/10 职场文书
大学生职业生涯规划书参考模板
2014/03/05 职场文书
幼儿园亲子活动总结
2014/04/26 职场文书
找工作求职信
2014/07/07 职场文书
学前教育专业求职信
2014/09/02 职场文书
不听老师话的万能检讨书
2014/10/04 职场文书
离婚协议书怎么写的
2014/12/14 职场文书
考试作弊检讨书范文
2015/01/27 职场文书
2015庆祝七一建党节94周年活动总结
2015/03/20 职场文书
工厂仓管员岗位职责
2015/04/01 职场文书
驳回起诉裁定书
2015/05/19 职场文书
夏洛特的网观后感
2015/06/15 职场文书
《亲亲我的妈妈》观后感(3篇)
2019/09/26 职场文书