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 相关文章推荐
ExtJS 学习专题(一) 如何应用ExtJS(附实例)
Mar 11 Javascript
js获取下拉列表的值和元素个数示例
May 07 Javascript
node.js中的socket.io的广播消息
Dec 15 Javascript
js密码强度校验
Nov 10 Javascript
Google 地图类型详解及示例代码
Aug 06 Javascript
Jquery组件easyUi实现手风琴(折叠面板)示例
Aug 23 Javascript
canvas 实现中国象棋
Feb 17 Javascript
ES6新特性四:变量的解构赋值实例
Apr 21 Javascript
Vue.js组件间的循环引用方法示例
Dec 27 Javascript
浅谈Vue初学之props的驼峰命名
Jul 19 Javascript
Vue项目安装插件并保存
Jan 28 Javascript
js实现数据导出为EXCEL(支持大量数据导出)
Mar 31 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快速url重写更新版[需php 5.30以上]
2010/04/25 PHP
php判断手机访问还是电脑访问示例分享
2014/01/20 PHP
php计算几分钟前、几小时前、几天前的几个函数、类分享
2014/04/09 PHP
PHP中的数组处理函数实例总结
2016/01/09 PHP
JSON PHP中,Json字符串反序列化成对象/数组的方法
2018/05/31 PHP
Laravel统一错误处理为JSON的方法介绍
2020/10/18 PHP
javascript基础的动画教程,直观易懂
2007/01/10 Javascript
JavaScript 操作键盘的Enter事件(键盘任何事件),兼容多浏览器
2010/10/11 Javascript
IE6下通过a标签点击切换图片的问题
2010/11/14 Javascript
中文路径导致unitpngfix.js不正常的解决方法
2013/06/26 Javascript
从jquery的过滤器.filter()方法想到的
2013/09/29 Javascript
JavaScript常用基础知识强化学习
2015/12/09 Javascript
基于AngularJS实现iOS8自带的计算器
2016/09/12 Javascript
jQuery弹出层插件popShow用法示例
2017/01/23 Javascript
jQuery+ThinkPHP+Ajax实现即时消息提醒功能实例代码
2017/03/21 jQuery
JavaScript实现快速排序的方法分析
2018/01/10 Javascript
js传递数组参数到后台controller的方法
2018/03/29 Javascript
webpack的tree shaking的实现方法
2019/09/18 Javascript
vue使用nprogress实现进度条
2019/12/09 Javascript
vant 解决tab切换插件标题样式自定义的问题
2020/11/13 Javascript
[45:52]完美世界DOTA2联赛PWL S3 Forest vs INK ICE 第二场 12.09
2020/12/12 DOTA
Python 中pandas.read_excel详细介绍
2017/06/23 Python
python使用pil进行图像处理(等比例压缩、裁剪)实例代码
2017/12/11 Python
Python实现GUI学生信息管理系统
2020/04/05 Python
Python实现网站表单提交和模板
2019/01/15 Python
详解用python自制微信机器人,定时发送天气预报
2019/03/25 Python
python 在某.py文件中调用其他.py内的函数的方法
2019/06/25 Python
Django配置MySQL数据库的完整步骤
2019/09/07 Python
使用keras根据层名称来初始化网络
2020/05/21 Python
基于SQLAlchemy实现操作MySQL并执行原生sql语句
2020/06/10 Python
国贸专业个人求职信分享
2013/12/04 职场文书
小学教师寄语大全
2014/04/03 职场文书
银行求职信范文
2014/05/26 职场文书
2016暑期政治学习心得体会
2016/01/23 职场文书
资深HR教你写好简历中的自我评价
2019/05/07 职场文书
CSS3 制作的悬停缩放特效
2021/04/13 HTML / CSS