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 相关文章推荐
发布BlueShow v1.0 图片浏览器(类似lightbox)blueshow.js 打包下载
Jul 21 Javascript
jQuery Flash/MP3/Video多媒体插件
Jan 18 Javascript
js href的用法
May 13 Javascript
js鼠标点击事件在各个浏览器中的写法及Event对象属性介绍
Jan 24 Javascript
jQuery实现鼠标滑过遮罩并高亮显示效果
Jul 16 Javascript
iframe里面的元素触发父窗口元素事件的jquery代码
Oct 19 Javascript
纯js实现重发验证码按钮倒数功能
Apr 21 Javascript
javascript显示倒计时控制按钮的简单实现
Jun 07 Javascript
jQuery实现的自定义弹出层效果实例详解
Sep 04 Javascript
vue组件实践之可搜索下拉框功能
Nov 25 Javascript
Vue组件间通信方法总结(父子组件、兄弟组件及祖先后代组件间)
Apr 17 Javascript
vue实力踩坑之push当前页无效
Apr 10 Vue.js
详解如何解决使用JSON.stringify时遇到的循环引用问题
vue 中 get / delete 传递数组参数方法
Mar 23 #Vue.js
JavaScript实现页面动态验证码的实现示例
使用Vue.js和MJML创建响应式电子邮件
JS原生实现轮播图的几种方法
几款主流好用的富文本编辑器(所见即所得常用编辑器)介绍
vue+flask实现视频合成功能(拖拽上传)
Mar 04 #Vue.js
You might like
PHP中改变图片的尺寸大小的代码
2011/07/17 PHP
php之curl设置超时实例
2014/11/03 PHP
PHP中的Trait 特性及作用
2016/04/03 PHP
Linux(CentOS)下PHP扩展PDO编译安装的方法
2016/04/07 PHP
PHP array_shift()用法实例分析
2019/01/07 PHP
PHP PDOStatement::bindValue讲解
2019/01/30 PHP
javascript实现的网页局布刷新效果
2008/12/01 Javascript
JS 获取span标签中的值的代码 支持ie与firefox
2009/08/24 Javascript
jMessageBox 基于jQuery的窗口插件
2009/12/09 Javascript
JavaScript Event学习第十章 一些可替换的事件对
2010/02/10 Javascript
IE6/7/8/9不支持exec的简写方式
2011/05/25 Javascript
JavaScript DOM元素尺寸和位置
2015/04/13 Javascript
jQuery+formdata实现上传进度特效遇到的问题
2016/02/24 Javascript
jquery分页插件jquery.pagination.js实现无刷新分页
2016/04/01 Javascript
js一维数组、多维数组和对象的混合使用方法
2016/04/03 Javascript
一个简单的JavaScript Map实例(分享)
2016/08/03 Javascript
JS限定手机版中图片大小随分辨率自动调整的方法
2016/12/05 Javascript
BootStrap table删除指定行的注意事项(笔记整理)
2017/02/05 Javascript
移动端手指放大缩小插件与js源码
2017/05/22 Javascript
mui 打开新窗口的方式总结及注意事项
2017/08/20 Javascript
微信小程序修改swiper默认指示器样式的实例代码
2018/07/18 Javascript
三分钟教你用Node做一个微信哄女友(基友)神器(面向小白)
2019/06/21 Javascript
为什么Vue3.0使用Proxy实现数据监听(defineProperty表示不背这个锅)
2019/10/14 Javascript
[01:56]2014DOTA2西雅图邀请赛 MVP外卡赛老队长精辟点评
2014/07/09 DOTA
django rest framework 数据的查找、过滤、排序的示例
2018/06/25 Python
django rest framework vue 实现用户登录详解
2019/07/29 Python
政法大学毕业生自荐信范文
2014/01/01 职场文书
家长通知书教师评语
2014/04/17 职场文书
中学生勤俭节约倡议书
2015/04/29 职场文书
关于职业道德的心得体会
2016/01/18 职场文书
《风娃娃》教学反思
2016/02/18 职场文书
二手手机买卖合同范本(2019年版)
2019/10/28 职场文书
Python爬取科目四考试题库的方法实现
2021/03/30 Python
sql字段解析器的实现示例
2021/06/23 SQL Server
springmvc直接不经过controller访问WEB-INF中的页面问题
2022/02/24 Java/Android
什么是Python装饰器?如何定义和使用?
2022/04/11 Python