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 相关文章推荐
JS实现浏览器菜单命令
Sep 05 Javascript
JavaScript 闭包在封装函数时的简单分析
Nov 28 Javascript
jquery解决图片路径不存在执行替换路径
Feb 06 Javascript
JavaScript常用小技巧小结
Dec 29 Javascript
JavaScript实现判断图片是否加载完成的3种方法整理
Mar 13 Javascript
javascript实现随时变化着的背景颜色
Apr 02 Javascript
jQuery手机拨号界面特效代码分享
Aug 27 Javascript
使用OpenLayers3 添加地图鼠标右键菜单
Dec 29 Javascript
基于jQuery实现美观且实用的倒计时实例代码
Dec 30 Javascript
jQuery实现弹幕效果
Feb 17 Javascript
Vue中 v-if 和v-else-if页面加载出现闪现的问题及解决方法
Oct 12 Javascript
判断文字超过2行添加展开按钮,未超过则不显示,溢出部分显示省略号
Apr 28 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中preg_match正则匹配中的/u、/i、/s含义
2015/04/17 PHP
php实现文件上传及头像预览功能
2017/01/15 PHP
iis 7下安装laravel 5.4环境的方法教程
2017/06/14 PHP
jquery tools之tabs 选项卡/页签
2009/07/25 Javascript
漂亮的jquery提示效果(仿腾讯弹出层)
2013/02/05 Javascript
jQuery实现简单网页遮罩层/弹出层效果兼容IE6、IE7
2014/06/16 Javascript
深入理解js promise chain
2016/05/05 Javascript
JavaScript学习小结之被嫌弃的eval函数和with语句实例详解
2016/08/01 Javascript
一篇看懂vuejs的状态管理神器 vuex状态管理模式
2017/04/20 Javascript
vuex进阶知识点巩固
2018/05/20 Javascript
使用Node搭建reactSSR服务端渲染架构
2018/08/30 Javascript
详解js静态检查工具eslint配置文件
2018/11/23 Javascript
基于Vue插入视频的2种方法小结
2019/04/02 Javascript
微信小程序Echarts图表组件使用方法详解
2019/06/25 Javascript
vue data引入本地图片的两种方式小结
2019/11/13 Javascript
jQuery使用jsonp实现百度搜索的示例代码
2020/07/08 jQuery
vue实现前端列表多条件筛选
2020/10/26 Javascript
pygame学习笔记(4):声音控制
2015/04/15 Python
Python编程之基于概率论的分类方法:朴素贝叶斯
2017/11/11 Python
Python实现的字典值比较功能示例
2018/01/08 Python
Python 数据库操作 SQLAlchemy的示例代码
2019/02/18 Python
Django框架实现分页显示内容的方法详解
2019/05/10 Python
执行Django数据迁移时报 1091错误及解决方法
2019/10/14 Python
从多个tfrecord文件中无限读取文件的例子
2020/02/17 Python
python图片验证码识别最新模块muggle_ocr的示例代码
2020/07/03 Python
CSS3 please 跨浏览器的CSS3产生器
2010/03/14 HTML / CSS
StubHub德国:购买和出售门票
2017/09/06 全球购物
怎样客观的做好自我评价
2013/12/28 职场文书
简历的自我评价
2014/02/03 职场文书
夜不归宿检讨书
2014/02/25 职场文书
公司离职证明范本(汇总)
2014/09/10 职场文书
2014年学生会干事工作总结
2014/11/07 职场文书
检讨书范文2000字
2015/01/28 职场文书
python模拟浏览器 使用selenium进入好友QQ空间并留言
2022/04/12 Python
openEuler 搭建java开发环境的详细过程
2022/06/10 Servers
JavaScript架构localStorage特殊场景下二次封装操作
2022/06/21 Javascript