当前位置: 首页 > Linux

在节点中使用shell脚本

时间:2023-04-06 22:21:15 Linux

背景在开发过程中,我们可能会在特定的场合需要一些脚本来批量处理我们的业务逻辑。如何在nodejs中调用shell脚本?在新项目下新建脚本文件touchnewFile.sh修改文件权限chmod777newFile.sh修改文件可读可写可执行nodejscallfileread//在nodejs的子进程中使用文件读取方法const{execFile}=require('child_process');示例DocsService.publishAllDocs=(req,res)=>{req.session.touch();const{docName,pathName,saveDocsList,docType}=req.body;vardocText=req.body.文档文本;varnewGit=req.body.newGit;//获取文件路径varfilepath=path.join(__dirname,'../../bin/rnsource/publishAllDocs.sh');varfileArr,fileName,spath,dirnameBack,docbackList=[],docbackPath,docPath="";varusername=req.session.user_name;varstr=docName+'/'+路径名+'|'+用户名;varreg=newRegExp(`^(${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+'/'+文件名;}docbackPath=path.join(__dirname,dirnameBackup);docbackList.push(docbackPath);docPath+=docbackPath+"";})docPath+=""//cwd设置当前路径。我这里设置的是nodejs代码jsexecFile(filepath,[docName,docPath,docType],{cwd:'.'},function(err,stdout,stderr){logger.info(stdout);if(err){loggerFileError({user:username,docName:docName,pathName:'all',operation:"一键发布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});}})}如果回调执行成功,将返回脚本execFile执行的命令。第一个参数:要调用的外部程序,这里是要读取的文件。第二个第一个参数:传递给外部程序的参数(必须放在数组中)第三个参数:回调函数,在回调中可以返回外部程序的执行结果脚本的.bat脚本window这里不解释#$1文档的最外层目录$2当前修改文件的名称$3当前修改文件所在的目录cd$(pwd)/gitlib/docs/$1echo"comein"foritemin$2;doecho"${item}"cp-f${item}${item/docBackup/docs}done#echo"初始化输入"echo"$(pwd)/gitlib/docs/$1"if["$3"=="docsify"];then#复制指定目录下的文件如:$1/$3/$2docs/cst/7e4ce1de04621e0b/#如cp-rf../../docBackup/wireless/docs/cst/7e4ce1de04621e0b/10708d589eedfffd.md./docs/cst/7e4ce1de04621e0b/cp-rf./docs../../../public/docs/$1else#处理gitbook类型文档gitbookbuildecho"copydocument"cp-rf./_book/*。./../../public/docs/$1fi根据业务调用中传入的数据接收参数获取参数直接使用“$”获取获取顺序就是传入数据的顺序一个参数是使用$1for循环。shell使用for...in的形式循环bodydataexample"/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空格分隔的字符串如:"abcde"##$2是脚本中接收到的业务参数根据拼接数据的格式如上数据示例##循环使用for...in记住;必须在do之后添加执行循环体,最后用done结束循环##item循环体的各个子项如:/Users/Desktop/work/docManager/docServer/gitlib/docBackup/mygitbook/docs/d09985fc67088b35/d09985fc67088b35.mdforitemin$2;doecho"${item}"cp-f${item}${item/docBackup/docs}done##${item/docBackup/docs}字符串替换##这是docBackupintheitempathreplacedwithdocs详细解释请看下面的shell字符串替换shell指定字符串替换在JS中我们可以使用replace来替换字符串,那么在shell中如何实现更改呢?示例:字符串“abc12342341”echo${string/23/bb}//abc1bb42341替换echo${string//23/bb}//abc1bb4bb41用双斜杠替换所有的匹配项echo${string/#abc/bb}//bb12342341#开头是什么,根php里面的^有点像echo${string/%41/bb}//abc123423bb%withwhat根php中的$有点像if条件判断的语法if[];then...else...fi例子##条件判断是用[]代替()##[]后面加上;if["$3"=="docsify"];then#复制指定目录下的文件,如:$1/$3/$2docs/cst/7e4ce1de04621e0b/#如cp-rf../../docBackup/wireless/docs/cst/7e4ce1de04621e0b/10708d589eedfffd.md./docs/cst/7e4ce1de04621e0b/cp-rf./docs../../../public/docs/$1else#处理gitbook类型的文件gitbookbuildecho"copydocument"cp-rf./_book/*../../../public/docs/$1fi注意条件判断中的字符串要用""双引号,如果有变量(string)在条件判断中,变量也要在条件判断后加""加双引号[];并使用then继续执行条件判断,最后使用fi结束