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 相关文章推荐
JQuery 学习笔记 选择器之二
Jul 23 Javascript
Javascript遍历Html Table示例(包括内容和属性值)
Jul 08 Javascript
node.js中的favicon.ico请求问题处理
Dec 15 Javascript
JS实现从顶部下拉显示的带动画QQ客服特效代码
Oct 24 Javascript
JavaScript操作HTML DOM节点的基础教程
Mar 11 Javascript
JS中使用apply方法通过不同数量的参数调用函数的方法
May 31 Javascript
用Node提供静态文件服务的方法
Jul 06 Javascript
Vue 实现手动刷新组件的方法
Feb 19 Javascript
JavaScript 实现同时选取多个时间段的方法
Oct 17 Javascript
微信小程序工具函数封装
Oct 28 Javascript
vue移动端模态框(可传参)的实现
Nov 20 Javascript
浅谈react useEffect闭包的坑
Jun 08 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
?生?D片??C字串
2006/12/06 PHP
完美解决:Apache启动问题―(OS 10022)提供了一个无效的参数
2013/06/08 PHP
Ubuntu server 11.04安装memcache及php使用memcache来存储session的方法
2016/05/31 PHP
PHPStorm+XDebug进行调试图文教程
2016/06/13 PHP
php+ajax+json 详解及实例代码
2016/12/12 PHP
浅谈PHP各环境下的伪静态配置
2019/03/13 PHP
php创建类并调用的实例方法
2019/09/25 PHP
wangEditor编辑器失去焦点后仍然可以在原位置插入图片分析
2015/05/06 Javascript
无刷新上传文件并返回自定义值
2015/06/11 Javascript
jQuery实现HTML表格单元格的合并功能
2016/04/06 Javascript
使用jquery判断一个元素是否含有一个指定的类(class)实例
2017/02/12 Javascript
基于HTML5+JS实现本地图片裁剪并上传功能
2017/03/24 Javascript
jQuery超简单遮罩层实现方法示例
2018/09/06 jQuery
浅谈微信小程序列表埋点曝光指南
2019/10/15 Javascript
[04:50]2019DOTA2高校联赛秋季赛四强集锦
2019/12/27 DOTA
Python开发的HTTP库requests详解
2017/08/29 Python
Python2实现的图片文本识别功能详解
2018/07/11 Python
linux中如何使用python3获取ip地址
2019/07/15 Python
Numpy数组array和矩阵matrix转换方法
2019/08/05 Python
python 字符串常用函数详解
2019/09/11 Python
Python list与NumPy array 区分详解
2019/11/06 Python
tensorflow 实现从checkpoint中获取graph信息
2020/02/10 Python
python实现可下载音乐的音乐播放器
2020/02/25 Python
Python爬虫教程知识点总结
2020/10/19 Python
一些高难度的SQL面试题
2016/11/29 面试题
班级聚会策划书
2014/01/16 职场文书
麦当劳辞职信范文
2014/01/18 职场文书
幼儿园教师个人反思
2014/01/30 职场文书
写求职信有什么意义
2014/02/17 职场文书
检查机关党的群众路线个人整改措施
2014/10/04 职场文书
医生个人年度总结
2015/02/28 职场文书
公司行政助理岗位职责
2015/04/11 职场文书
2016关于军训的心得体会
2016/01/11 职场文书
详解Apache SkyWalking 告警配置指南
2021/04/22 Servers
python读取mnist数据集方法案例详解
2021/09/04 Python
Redis Stream类型的使用详解
2021/11/11 Redis