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 相关文章推荐
TFDN图片播放器 不错自动播放
Oct 03 Javascript
简明json介绍
Sep 28 Javascript
javascript 特性检测并非浏览器检测
Jan 15 Javascript
js常用系统函数用法实例分析
Jan 12 Javascript
jQuery插件zepto.js简单实现tab切换
Jun 16 Javascript
关于Ajax的原理以及代码封装详解
Sep 08 Javascript
swiper移动端轮播插件(触碰图片之后停止轮播)
Dec 28 Javascript
Vue 拦截器对token过期处理方法
Jan 23 Javascript
基于vue-cli 打包时抽离项目相关配置文件详解
Mar 07 Javascript
配置eslint规范项目代码风格
Mar 11 Javascript
详解在React-Native中持久化redux数据
May 22 Javascript
浅谈如何优雅处理JavaScript异步错误
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强制更新图片缓存的方法
2015/02/11 PHP
Yii框架弹出窗口组件CJuiDialog用法分析
2017/01/07 PHP
实现php删除链表中重复的结点
2018/09/27 PHP
javascript 按回车键相应按钮提交事件
2009/11/02 Javascript
一些常用且实用的原生JavaScript函数
2010/09/08 Javascript
让人印象深刻的10个jQuery手风琴效果应用
2012/05/08 Javascript
js抽奖实现随机抽奖代码效果
2013/12/02 Javascript
jquery获取复选框被选中的值
2014/03/22 Javascript
Javascript连接多个数组不用concat来解决
2014/03/24 Javascript
JavaScript中的prototype和constructor简明总结
2014/04/05 Javascript
禁用Enter键表单自动提交实现代码
2014/05/22 Javascript
浅谈JavaScript的Polymer框架中的事件绑定
2015/07/29 Javascript
javascript中类的定义方式详解(四种方式)
2015/12/22 Javascript
jquery中取消和绑定hover事件的实现代码
2016/06/02 Javascript
如何去除vue项目中的#及其ie9兼容性
2018/01/11 Javascript
vue3.0 CLI - 2.3 - 组件 home.vue 中学习指令和绑定
2018/09/14 Javascript
详解Vue前端生产环境发布配置实战篇
2019/05/07 Javascript
nodejs实现获取本地文件夹下图片信息功能示例
2019/06/22 NodeJs
vue打开子组件弹窗都刷新功能的实现
2020/09/21 Javascript
Python ORM框架SQLAlchemy学习笔记之数据查询实例
2014/06/10 Python
python网络编程之读取网站根目录实例
2014/09/30 Python
Python实现把xml或xsl转换为html格式
2015/04/08 Python
使用python 和 lint 删除项目无用资源的方法
2017/12/20 Python
django中send_mail功能实现详解
2018/02/06 Python
python定向爬虫校园论坛帖子信息
2018/07/23 Python
python3调用百度翻译API实现实时翻译
2018/08/16 Python
python读取csv和txt数据转换成向量的实例
2019/02/12 Python
Docker部署Python爬虫项目的方法步骤
2020/01/19 Python
Python3爬虫里关于识别微博宫格验证码的知识点详解
2020/07/30 Python
ProBikeKit美国官网:自行车套件,跑步和铁人三项套件
2016/10/13 全球购物
澳大利亚手表品牌:Time IV Change
2018/10/06 全球购物
Furla官网:意大利著名的皮革品牌
2019/08/06 全球购物
SQL实现LeetCode(197.上升温度)
2021/08/07 MySQL
关于 Python json中load和loads区别
2021/11/07 Python
JavaScript 中for/of,for/in 的详细介绍
2021/11/17 Javascript
i7 6700处理器相当于i5几代
2022/04/19 数码科技