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 CHECKBOX全选,取消全选,反选方法三
Aug 30 Javascript
Javascript操作select方法大全[新增、修改、删除、选中、清空、判断存在等]
Sep 26 Javascript
点击隐藏页面左栏或右栏实现js代码
Apr 01 Javascript
javascript正则表达式使用replace()替换手机号的方法
Jan 19 Javascript
Flow之一个新的Javascript静态类型检查器
Dec 21 Javascript
功能强大的Bootstrap组件(结合js)
Aug 03 Javascript
解析jQueryEasyUI的使用
Nov 22 Javascript
angularJS的radio实现单项二选一的使用方法
Feb 28 Javascript
VUE Error: getaddrinfo ENOTFOUND localhost
May 03 Javascript
Vue的watch和computed方法的使用及区别介绍
Sep 06 Javascript
解决在Vue中使用axios用form表单出现的问题
Oct 30 Javascript
javascript执行上下文、变量对象实例分析
Apr 25 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
yii2中结合gridview如何使用modal弹窗实例代码详解
2016/06/12 PHP
PHP中多线程的两个实现方法
2016/10/14 PHP
PHP预定义超全局数组变量小结
2018/08/20 PHP
php使用goto实现自动重启swoole、reactphp、workerman服务的代码
2020/04/13 PHP
JS 毫秒转时间示例代码
2013/09/22 Javascript
JQuery实现倒计时按钮具体方法
2013/11/14 Javascript
jQuery实现灰蓝风格标准二级下拉菜单效果代码
2015/08/31 Javascript
jQuery获取同级元素的简单代码
2016/07/09 Javascript
js记录点击某个按钮的次数-刷新次数为初始状态的实例
2017/02/15 Javascript
基于layer.js实现收货地址弹框选择然后返回相应的地址信息
2017/05/26 Javascript
jQuery为某个div加入行样式
2017/06/09 jQuery
图片懒加载imgLazyLoading.js使用详解
2020/09/15 Javascript
关于RxJS Subject的学习笔记
2018/12/05 Javascript
Vue实现剪贴板复制功能
2019/12/31 Javascript
基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件功能
2021/02/23 Vue.js
[00:53]TI3正赛第三天 DK怒破A队不败金身 现场国旗飘扬热血激昂
2013/08/10 DOTA
Python3里的super()和__class__使用介绍
2015/04/23 Python
简单分析Python中用fork()函数生成的子进程
2015/05/04 Python
windows下添加Python环境变量的方法汇总
2018/05/14 Python
Python使用numpy产生正态分布随机数的向量或矩阵操作示例
2018/08/22 Python
tensorflow实现加载mnist数据集
2018/09/08 Python
安装python及pycharm的教程图解
2019/10/10 Python
Python+OpenCV+图片旋转并用原底色填充新四角的例子
2019/12/12 Python
对python中arange()和linspace()的区别说明
2020/05/03 Python
Python函数递归调用实现原理实例解析
2020/08/11 Python
澳大利亚潮流尖端的快时尚品牌:Cotton On
2016/09/26 全球购物
工商管理专业学生的自我评价
2013/10/01 职场文书
社团活动策划书范文
2014/01/09 职场文书
庆祝教师节演讲稿
2014/09/03 职场文书
小学音乐教师个人工作总结
2015/02/05 职场文书
搞笑婚前保证书
2015/02/28 职场文书
2015年度服装销售工作总结
2015/03/31 职场文书
材料采购员岗位职责
2015/04/03 职场文书
看上去很美观后感
2015/06/10 职场文书
golang 实现Location跳转方式
2021/05/02 Golang
Vue.Draggable实现交换位置
2022/04/07 Vue.js