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 相关文章推荐
文本框中,回车键触发事件的js代码[多浏览器兼容]
Jun 07 Javascript
js过滤HTML标签以及空格的思路及代码
May 24 Javascript
jquery mobile开发常见问题分析
Jan 21 Javascript
JQuery EasyUI Layout 在from布局自适应窗口大小的实现方法
May 28 Javascript
Bootstrap幻灯片轮播图支持触屏左右手势滑动的实现方法
Oct 13 Javascript
Node.js websocket使用socket.io库实现实时聊天室
Feb 20 Javascript
vue 1.x 交互实现仿百度下拉列表示例
Oct 21 Javascript
Vue集成Iframe页面的方法示例
Dec 12 Javascript
AngularJS监听ng-repeat渲染完成的两种方法
Jan 16 Javascript
jQuery pagination分页示例详解
Oct 23 jQuery
推荐几个不错的console调试技巧实现
Dec 20 Javascript
vue+ESLint 配置保存 自动格式化代码
Mar 17 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 多关键字 高亮显示实现代码
2012/04/23 PHP
PHP转换文件夹下所有文件编码的实现代码
2013/06/06 PHP
解析link_mysql的php版
2013/06/30 PHP
解析PHP实现下载文件的两种方法
2013/07/05 PHP
PHP获取本周第一天和最后一天示例代码
2014/02/24 PHP
用php来限制每个ip每天浏览页面数量的实现思路
2015/02/24 PHP
CentOS7.0下安装PHP5.6.30服务的教程详解
2018/09/29 PHP
select 控制网页内容隐藏于显示的实现代码
2010/05/25 Javascript
JS中实现replaceAll的方法(实例代码)
2013/11/12 Javascript
jQuery前端框架easyui使用Dialog时bug处理
2014/12/05 Javascript
jQuery监控文本框事件并作相应处理的方法
2015/04/16 Javascript
js与jQuery实现checkbox复选框全选/全不选的方法
2016/01/05 Javascript
使用DeviceOne实现微信小程序功能
2016/12/29 Javascript
AngularJS实现单一页面内设置跳转路由的方法
2017/06/28 Javascript
vue2.0 axios前后端数据处理实例代码
2017/06/30 Javascript
对类Vue的MVVM前端库的实现代码
2018/09/07 Javascript
vue接入腾讯防水墙代码
2019/05/07 Javascript
微信小程序上传图片到php服务器的方法
2019/05/23 Javascript
[01:02:48]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 LGD vs OG
2018/04/02 DOTA
Python sys.path详细介绍
2013/10/17 Python
Python中分数的相关使用教程
2015/03/30 Python
Python求两个文本文件以行为单位的交集、并集与差集的方法
2015/06/17 Python
python实现维吉尼亚加密法
2019/03/20 Python
详解使用python绘制混淆矩阵(confusion_matrix)
2019/07/14 Python
Python装饰器原理与基本用法分析
2020/01/07 Python
tensorflow 自定义损失函数示例代码
2020/02/05 Python
django使用JWT保存用户登录信息
2020/04/22 Python
Django ORM 查询表中某列字段值的方法
2020/04/30 Python
浅谈CSS3 box-sizing 属性 有趣的盒模型
2019/04/02 HTML / CSS
html5本地存储 localStorage操作使用详解
2016/09/20 HTML / CSS
介绍一下SQL中union,intersect和minus
2012/04/05 面试题
网络安全方面的面试题
2015/11/04 面试题
综合素质评价自我评价
2015/03/06 职场文书
《静夜思》教学反思
2016/02/17 职场文书
Python if else条件语句形式详解
2022/03/24 Python
分析SQL窗口函数之聚合窗口函数
2022/04/21 Oracle