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 相关文章推荐
客户端 使用XML DOM加载json数据的方法
Sep 28 Javascript
JavaScript 判断日期格式是否正确的实现代码
Jul 04 Javascript
javascript读写json示例
Apr 11 Javascript
JavaScript定义变量和变量优先级问题探讨
Oct 11 Javascript
JavaScript结合AJAX_stream实现流式显示
Jan 08 Javascript
Java File类的常用方法总结
Mar 18 Javascript
以jQuery中$.Deferred对象为例讲解promise对象是如何处理异步问题
Nov 13 Javascript
jquery mobile 实现自定义confirm确认框效果的简单实例
Jun 17 Javascript
基于Vue实现页面切换左右滑动效果
Jun 29 Javascript
vue项目中v-model父子组件通信的实现详解
Dec 10 Javascript
解决webpack+Vue引入iView找不到字体文件的问题
Sep 28 Javascript
vue 中的动态传参和query传参操作
Nov 09 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
一个基于PDO的数据库操作类(新) 一个PDO事务实例
2011/07/03 PHP
php判断字符串在另一个字符串位置的方法
2014/02/27 PHP
PHP取余函数介绍MOD(x,y)与x%y
2014/05/15 PHP
php中array_multisort对多维数组排序的方法
2020/06/21 PHP
解析JavaScript中instanceof对于不同的构造器或许都返回true
2013/12/03 Javascript
JS实现鼠标点击展开或隐藏表格行的方法
2015/03/03 Javascript
js实现Select列表内容自动滚动效果代码
2015/08/20 Javascript
全面解析Bootstrap中tab(选项卡)的使用方法
2016/06/06 Javascript
轻松5句话解决JavaScript的作用域
2016/07/15 Javascript
Node.js的基本知识简单汇总
2016/09/19 Javascript
使用jquery.qrcode.js生成二维码插件
2016/10/17 Javascript
AngularJS学习第二篇 AngularJS依赖注入
2017/02/13 Javascript
Vue.Js中的$watch()方法总结
2017/03/23 Javascript
vue如何使用 Slot 分发内容实例详解
2017/09/05 Javascript
bootstrap3中container与container_fluid外层容器的区别讲解
2017/12/04 Javascript
Vuex提升学习篇
2018/01/11 Javascript
在Vue中使用echarts的方法
2018/02/05 Javascript
简单说说angular.json文件的使用
2018/10/29 Javascript
部署vue+Springboot前后端分离项目的步骤实现
2020/05/31 Javascript
python批量修改文件名的实现代码
2014/09/01 Python
Python下载指定页面上图片的方法
2016/05/12 Python
关于python字符串方法分类详解
2019/08/20 Python
亚洲最大旅游体验平台:KKday
2017/10/21 全球购物
英国内衣连锁店:Boux Avenue
2018/01/24 全球购物
明信片寄语大全
2014/04/08 职场文书
体育馆的标语
2014/06/24 职场文书
环保志愿者活动方案
2014/08/14 职场文书
公共场所禁烟倡议书
2014/08/30 职场文书
三严三实对照检查材料
2014/09/22 职场文书
考试作弊检讨书1000字(5篇)
2014/10/19 职场文书
党的群众路线教育实践活动个人对照检查材料(校长)
2014/11/05 职场文书
避暑山庄导游词
2015/02/04 职场文书
初中地理教学反思
2016/02/19 职场文书
读《庄子》有感:美而不自知
2019/11/06 职场文书
Python用any()函数检查字符串中的字母以及如何使用all()函数
2022/04/14 Python
使用refresh_token实现无感刷新页面
2022/04/26 Javascript