node中使用shell脚本的方法步骤

在开发中我们在特定的场合下可能需要一些脚本来批量处理我们的业务逻辑,在nodejs如何调用shell脚本呢?

Posted in Javascript onMarch 23, 2021

新建

项目下新建脚本文件

touch newFile.sh

修改文件权限

chmod 777 newFile.sh //修改文件为可读可写可执行

nodejs调用

文件读取

//使用nodejs的子进程里面的文件读取方法
const { execFile } = require('child_process');

示例

DocsService.publishAllDocs = (req, res) => {
 req.session.touch();
 const { docName, pathName, saveDocsList, docType } = req.body;
 var docText = req.body.docText;
 var newGit = req.body.newGit;
 //获取文件路径
 var filepath = path.join(__dirname, '../../bin/rnsource/publishAllDocs.sh');
 var fileArr, fileName, spath, dirnameBack, docbackList = [], docbackPath, docPath = "";
 var username = req.session.user_name;
 var str = docName+'/'+ pathName + '|'+ username;
 var reg = new RegExp(`^(${str})`);
 saveDocsList.map((item, index)=>{
   fileArr = item.pathName.split("/");
   fileName = fileArr[fileArr.length-1];
   if(docType == "docsify"){
     dirnameBack = fileName != "" ? `../../gitlib/docBackup/${docName}/docs/${item.pathName}`:`../../gitlib/docBackup/${docName}/docs/README.md`
   }else{
     spath = item.pathName.split(fileName)[0];
     dirnameBack = spath != "" ?'../../gitlib/docBackup/'+ docName+'/'+ spath +'/'+fileName:'../../gitlib/docBackup/'+ docName+'/' + fileName; 
   }
 
   docbackPath = path.join(__dirname, dirnameBack);
   docbackList.push(docbackPath);
   docPath += docbackPath + " ";
 })
 docPath += ""
 //cwd设置当前路径 我这边设置的就是nodejs代码js当前的位置
 execFile(filepath, [docName, docPath, docType], { cwd: '.' }, function(err, stdout, stderr){
   logger.info(stdout);
   if(err){
     loggerFileError({user:username,docName:docName,pathName:'all',operate:"gitbook文件一键发布",err});
     res.json({
       respCode: -1,
       errMsg: "一键发布失败"
     })
   }else{
     res.json({
       respCode: 0,
       msg: "一键发布成功"
     })
     gitPush({ docName, fileName, docbackPath: docbackList, username, pathName, docType })
     unblockFile({ docName, username, pathName, reg });
   }
 }) 
}

回调

执行成功会返回脚本执行的命令

node中使用shell脚本的方法步骤

execFile

  • 第一个参数:要调用的外部程序,这里是要读取的文件
  • 第二个参数:传给外部程序的参数(必须要放在数组里面)
  • 第三个参数:回调函数,在回调中可以回去外部程序的执行结果

shell

publishAllDocs.sh 主意:此处说明的都是非window下的shell脚本 window的.bat脚本不在此处讲解

#$1文档最外层目录 $2当前修改的文件名 $3当前修改文件的目录
cd $(pwd)/gitlib/docs/$1
echo "come in"
for item in $2; do
  echo "${item}"
  cp -f ${item} ${item/docBackup/docs}
done
# echo "初始化进入"
echo "$(pwd)/gitlib/docs/$1"
if [ "$3" == "docsify" ];then
  #拷贝指定目录下的文件 如: $1/$3/$2 docs/cst/7e4ce1de04621e0b/
  #如 cp -rf ../../docBackup/wireless/docs/cst/7e4ce1de04621e0b/10708d589eedfffd.md ./docs/cst/7e4ce1de04621e0b/
  cp -rf ./docs ../../../public/docs/$1
else
  # 处理gitbook类型文档
  gitbook build
  echo "复制文档"
  cp -rf ./_book/* ../../../public/docs/$1
fi

参数接收

  • 根据业务调用时传参的数据来获取参数
  • 直接使用"$"来获取
  • 获取顺序就是数据传入顺序
  • 切记不是数组角标的取值 数组第一个参数就是$1

for循环的使用

在shell使用for…in的形式

需要循环的循环体数据示例

"/Users/Desktop/work/docManager/docServer/gitlib/docBackup/mygitbook/docs/d09985fc67088b35/d09985fc67088b35.md /Users/Desktop/work/docManager/docServer/gitlib/docBackup/mygitbook/docs/d09985fc67088b35/d09985fc67088b35/6f7a2c61c9bac0a3.md /Users/Desktop/work/docManager/docServer/gitlib/docBackup/mygitbook/README.md /Users/Desktop/work/docManager/docServer/gitlib/docBackup/mygitbook/docs/d09985fc67088b35/d09985fc67088b35/6f7a2c61c9bac0a3.md "

shell脚本里面的循环体的数据比较特殊不是我们常规的数组或者json

直接就是以空格隔开的一个字符串 如: “a b c d e”

## $2就是脚本里面接收的业务的传参 按格式拼接好的数据 如上面数据示例
## 循环使用 for...in 记得;后面一定要加上do去执行循环体 最后使用done结束循环
## item循环体的每个子项 如:/Users/Desktop/work/docManager/docServer/gitlib/docBackup/mygitbook/docs/d09985fc67088b35/d09985fc67088b35.md
for item in $2; do
  echo "${item}"
  cp -f ${item} ${item/docBackup/docs}
done
## ${item/docBackup/docs} 字符串替换
## 此处是吧item路径里面的docBackup替换成docs 详细解释请看下面的shell字符串替换

shell指定字符串替换

在JS里面我们可以使用replace去做字符串的替换,那么shell里面改如何实现?

示例:

string “abc12342341”

  • echo ${string/23/bb} //abc1bb42341 替换一次
  • echo ${string//23/bb} //abc1bb4bb41 双斜杠替换所有匹配
  • echo ${string/#abc/bb} //bb12342341 #以什么开头来匹配,根php中的^有点像
  • echo ${string/%41/bb} //abc123423bb %以什么结尾来匹配,根php中的$有点像

if条件判断的使用

语法

if[];then
 ...
else
 ...
fi

示例

## 条件判断是使用[]而不是()
## []后面要加;
if [ "$3" == "docsify" ];then
  #拷贝指定目录下的文件 如: $1/$3/$2 docs/cst/7e4ce1de04621e0b/
  #如 cp -rf ../../docBackup/wireless/docs/cst/7e4ce1de04621e0b/10708d589eedfffd.md ./docs/cst/7e4ce1de04621e0b/
  cp -rf ./docs ../../../public/docs/$1
else
  # 处理gitbook类型文档
  gitbook build
  echo "复制文档"
  cp -rf ./_book/* ../../../public/docs/$1
fi

注意

  • 条件判断里面字符串要使用""双引号
  • 如果条件判断里面有变量(字符串) 变量也要添加""双引号
  • 条件判断[]后面要加上;并且一点要使用then才能继续执行
  • 条件判断最后要使用fi结尾
Javascript 相关文章推荐
ajax 缓存 问题 requestheader
Aug 01 Javascript
div模拟滚动条效果示例代码
Oct 16 Javascript
JavaScript对内存分配及管理机制详细解析
Nov 11 Javascript
JavaScript利用正则表达式去除日期中的-
Jun 09 Javascript
bootstrap fileinput插件实现预览上传照片功能
Jan 23 Javascript
浅谈mvvm-simple双向绑定简单实现
Apr 18 Javascript
JavaScript反射与依赖注入实例详解
May 29 Javascript
React router动态加载组件之适配器模式的应用详解
Sep 12 Javascript
在vue项目中引入highcharts图表的方法
Jan 21 Javascript
vue+koa2实现session、token登陆状态验证的示例
Aug 30 Javascript
原生js无缝轮播插件使用详解
Mar 09 Javascript
javascript代码实现简易计算器
Jan 25 Javascript
详解如何解决使用JSON.stringify时遇到的循环引用问题
vue 中 get / delete 传递数组参数方法
Mar 23 #Vue.js
JavaScript实现页面动态验证码的实现示例
使用Vue.js和MJML创建响应式电子邮件
JS原生实现轮播图的几种方法
几款主流好用的富文本编辑器(所见即所得常用编辑器)介绍
vue+flask实现视频合成功能(拖拽上传)
Mar 04 #Vue.js
You might like
php empty() 检查一个变量是否为空
2011/11/10 PHP
Symfony2实现在controller中获取url的方法
2016/03/18 PHP
PHP的Yii框架中创建视图和渲染视图的方法详解
2016/03/29 PHP
PHP获取指定时间段之间的 年,月,天,时,分,秒
2016/06/05 PHP
比较全的JS checkbox全选、取消全选、删除功能代码
2008/12/19 Javascript
js的表单操作 简单计算器
2011/12/29 Javascript
兼容最新firefox、chrome和IE的javascript图片预览实现代码
2014/08/08 Javascript
js实现文字滚动效果
2016/03/03 Javascript
基于Bootstrap的Metronic框架实现页面链接收藏夹功能
2016/08/29 Javascript
利用JS如何计算字符串所占字节数示例代码
2017/09/13 Javascript
JavaScript寄生组合式继承原理与用法分析
2019/01/11 Javascript
vue-router重定向和路由别名的使用讲解
2019/01/19 Javascript
使用Angular Cli如何创建Angular私有库详解
2019/01/30 Javascript
vue的列表交错过渡实现代码示例
2019/05/05 Javascript
vue中template的三种写法示例
2020/10/21 Javascript
js实现弹窗猜数字游戏
2020/11/26 Javascript
用Python中的wxPython实现最基本的浏览器功能
2015/04/14 Python
python数据结构之图深度优先和广度优先实例详解
2015/07/08 Python
利用matplotlib+numpy绘制多种绘图的方法实例
2017/05/03 Python
python requests 使用快速入门
2017/08/31 Python
基于python求两个列表的并集.交集.差集
2020/02/10 Python
HTML5 canvas绘制的玫瑰花效果
2014/05/29 HTML / CSS
10个最常见的HTML5面试题 附答案
2016/06/06 HTML / CSS
韩国江南富人区高端时尚百货商场:Galleria(格乐丽雅)
2018/03/27 全球购物
Lululemon加拿大官网:加拿大知名体育服装零售商
2019/04/12 全球购物
澳大利亚最受欢迎的女士度假服装:Kabana Shop
2020/10/10 全球购物
小学教育毕业生自荐信
2013/11/18 职场文书
合伙协议书范本
2014/04/21 职场文书
机电专业求职信
2014/06/14 职场文书
奉献爱心演讲稿
2014/09/04 职场文书
机关作风建设自查报告
2014/10/22 职场文书
考察邀请函范文
2015/01/31 职场文书
师范生见习自我总结
2015/06/23 职场文书
幽默导游词应该怎么写?
2019/08/26 职场文书
关于食品安全的演讲稿范文(三篇)
2019/10/21 职场文书
MongoDB支持的数据类型
2022/04/11 MongoDB