在開發中咱們在特定的場合下可能須要一些腳原本批量處理咱們的業務邏輯,在nodejs如何調用shell腳本呢?php
項目下新建腳本文件node
touch newFile.sh
修改文件權限git
chmod 777 newFile.sh 修改文件爲可讀可寫可執行
//使用nodejs的子進程裏面的文件讀取方法const { execFile } = require('child_process');shell
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 }); } }) }
執行成功會返回腳本執行的命令 json
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
須要循環的循環體數據示例數組
"/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 "
## $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字符串替換
在JS裏面咱們能夠使用replace去作字符串的替換,那麼shell裏面改如何實現?
示例: session
string "abc12342341"less
${string/%41/bb}
//abc123423bb %以什麼結尾來匹配,根php中的$有點像語法函數
if[];then ... else ... fi
示例ui
## 條件判斷是使用[]而不是() ## []後面要加; 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
注意