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技巧
Dec 06 Javascript
jquery 双色表格实现代码
Dec 08 Javascript
IE与Firefox在JavaScript上的7个不同句法分享
Oct 30 Javascript
IE中图片的onload事件无效问题和解决方法
Jun 06 Javascript
js传递数组参数到后台controller的方法
Mar 29 Javascript
Angular入口组件(entry component)与声明式组件的区别详解
Apr 09 Javascript
微信小程序实现美团菜单
Jun 06 Javascript
vue项目部署上线遇到的问题及解决方法
Jun 10 Javascript
取消Bootstrap的dropdown-menu点击默认关闭事件方法
Aug 10 Javascript
vue获取元素宽、高、距离左边距离,右,上距离等还有XY坐标轴的方法
Sep 05 Javascript
JavaScript创建对象方式总结【工厂模式、构造函数模式、原型模式等】
Dec 19 Javascript
react-native聊天室|RN版聊天App仿微信实例|RN仿微信界面
Nov 12 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 MYSQL 数据备份类
2009/06/19 PHP
php ss7.5的数据调用 (笔记)
2010/03/08 PHP
paypal即时到账php实现代码
2010/11/28 PHP
jquery图片延迟加载 前端开发技能必备系列
2012/06/18 Javascript
js监听滚动条滚动事件使得某个标签内容始终位于同一位置
2014/01/24 Javascript
JS弹出可拖拽可关闭的div层完整实例
2015/02/13 Javascript
Javascript writable特性介绍
2015/02/27 Javascript
jQuery语法小结(超实用)
2015/12/31 Javascript
javascript中去除数组重复元素的实现方法【实例】
2016/04/12 Javascript
Bootstrap前端开发案例二
2016/06/17 Javascript
js获取form表单所有数据的简单方法
2016/08/18 Javascript
Node.js利用Net模块实现多人命令行聊天室的方法
2016/12/23 Javascript
vue使用技巧及vue项目中遇到的问题
2018/06/04 Javascript
Node.js API详解之 module模块用法实例分析
2020/05/13 Javascript
[44:51]2018DOTA2亚洲邀请赛 4.4 淘汰赛 VP vs Liquid 第二场
2018/04/05 DOTA
[57:28]2018DOTA2亚洲邀请赛 4.6 淘汰赛 TNC vs Liquid 第一场
2018/04/10 DOTA
[02:47]2018年度DOTA2最佳辅助位选手4号位-完美盛典
2018/12/17 DOTA
python写入xml文件的方法
2015/05/08 Python
Python简单实现enum功能的方法
2016/04/25 Python
Python的Flask站点中集成xhEditor文本编辑器的教程
2016/06/13 Python
python中闭包Closure函数作为返回值的方法示例
2017/12/17 Python
Python列表原理与用法详解【创建、元素增加、删除、访问、计数、切片、遍历等】
2019/10/30 Python
使用Dajngo 通过代码添加xadmin用户和权限(组)
2020/07/03 Python
利用python 读写csv文件
2020/09/10 Python
CSS3 滤镜 webkit-filter详细介绍及使用方法
2012/12/27 HTML / CSS
纯CSS3+DIV实现小三角形边框效果的示例代码
2020/08/03 HTML / CSS
基于第一个PhoneGap(cordova)的应用详解
2013/05/03 HTML / CSS
美国最佳选择产品网站:Best Choice Products
2019/05/27 全球购物
岗位竞聘演讲稿
2014/01/10 职场文书
大学校庆策划书
2014/01/31 职场文书
网络工程专业大学生求职信
2014/10/01 职场文书
学校党的群众路线教育实践活动总结材料
2014/10/30 职场文书
网络营销计划
2015/01/17 职场文书
环保建议书作文300字
2015/09/14 职场文书
幼儿园音乐教学反思
2016/02/18 职场文书
python manim实现排序算法动画示例
2022/08/14 Python