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 相关文章推荐
为数据添加append,remove功能
Oct 03 Javascript
javascript 清空form表单中某种元素的值
Dec 26 Javascript
jquery ui 1.7 ui.tabs 动态添加与关闭(按钮关闭+双击关闭)
Apr 01 Javascript
js获取浏览器基本信息大全
Nov 27 Javascript
jQuery实现的网页左侧在线客服效果代码
Oct 23 Javascript
jquery动态增加删减表格行特效
Nov 20 Javascript
利用纯Vue.js构建Bootstrap组件
Nov 03 Javascript
利用BootStrap的Carousel.js实现轮播图动画效果
Dec 21 Javascript
基于Vue实现timepicker
Apr 25 Javascript
浅析node应用的timing-attack安全漏洞
Feb 28 Javascript
jQuery滚动条美化插件nicescroll简单用法示例
Apr 18 jQuery
element-ui table行点击获取行索引(index)并利用索引更换行顺序
Feb 27 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 5.3.0 安装分析心得
2009/08/07 PHP
Yii输入正确验证码却验证失败的解决方法
2017/06/06 PHP
jQuery 1.0.4 - New Wave Javascript(js源文件)
2007/01/15 Javascript
IE8 chrome中table隔行换色解决办法
2010/07/09 Javascript
更优雅的事件触发兼容
2011/10/24 Javascript
js函数获取html中className所在的内容并去除标签
2013/09/08 Javascript
jQuery的:parent选择器定义和用法
2014/07/01 Javascript
js实现当复选框选择匿名登录时隐藏登录框效果
2015/08/14 Javascript
Javascript数组Array方法解读
2016/03/13 Javascript
jquery validate表单验证插件
2016/09/06 Javascript
Node.js中的require.resolve方法使用简介
2017/04/23 Javascript
Node.JS中快速扫描端口并发现局域网内的Web服务器地址(80)
2017/09/18 Javascript
使用nodeJs来安装less及编译less文件为css文件的方法
2017/11/20 NodeJs
浅谈Vue路由快照实现思路及其问题
2018/06/07 Javascript
了解Javascript中函数作为对象的魅力
2019/06/19 Javascript
vue修改Element的el-table样式的4种方法
2020/09/17 Javascript
element-ui中el-upload多文件一次性上传的实现
2020/12/02 Javascript
【Python】Python的urllib模块、urllib2模块批量进行网页下载文件
2016/11/19 Python
Python基于回溯法子集树模板解决0-1背包问题实例
2017/09/02 Python
Python logging管理不同级别log打印和存储实例
2018/01/19 Python
python 统计数组中元素出现次数并进行排序的实例
2018/07/02 Python
Python拼接微信好友头像大图的实现方法
2018/08/01 Python
python实现多进程代码示例
2018/10/31 Python
Python爬取爱奇艺电影信息代码实例
2019/11/26 Python
Django 权限管理(permissions)与用户组(group)详解
2020/11/30 Python
在pycharm中使用pipenv创建虚拟环境和安装django的详细教程
2020/11/30 Python
Pandas数据分析的一些常用小技巧
2021/02/07 Python
anaconda升级sklearn版本的实现方法
2021/02/22 Python
曼城官方网上商店:Manchester City
2019/09/10 全球购物
俄罗斯大型在线书店:Читай-город
2019/10/10 全球购物
小学毕业感言150字
2014/02/05 职场文书
颁奖典礼主持词
2014/03/25 职场文书
反对邪教标语
2014/06/30 职场文书
2014年汽车销售工作总结
2014/12/01 职场文书
2015年度团总支工作总结
2015/04/23 职场文书
收音机爱好者玩机13年,简评其使用过的19台收音机
2022/04/30 无线电