node中使用shell腳本的方法步驟
背景
在開發(fā)中我們?cè)谔囟ǖ膱?chǎng)合下可能需要一些腳本來批量處理我們的業(yè)務(wù)邏輯,在nodejs如何調(diào)用shell腳本呢?
新建
項(xiàng)目下新建腳本文件
touch newFile.sh
修改文件權(quán)限
chmod 777 newFile.sh 修改文件為可讀可寫可執(zhí)行
nodejs調(diào)用
文件讀取
//使用nodejs的子進(jìn)程里面的文件讀取方法 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設(shè)置當(dāng)前路徑 我這邊設(shè)置的就是nodejs代碼js當(dāng)前的位置 execFile(filepath, [docName, docPath, docType], { cwd: '.' }, function(err, stdout, stderr){ logger.info(stdout); if(err){ loggerFileError({user:username,docName:docName,pathName:'all',operate:"gitbook文件一鍵發(fā)布",err}); res.json({ respCode: -1, errMsg: "一鍵發(fā)布失敗" }) }else{ res.json({ respCode: 0, msg: "一鍵發(fā)布成功" }) gitPush({ docName, fileName, docbackPath: docbackList, username, pathName, docType }) unblockFile({ docName, username, pathName, reg }); } }) }
回調(diào)
執(zhí)行成功會(huì)返回腳本執(zhí)行的命令
execFile
- 第一個(gè)參數(shù):要調(diào)用的外部程序,這里是要讀取的文件
- 第二個(gè)參數(shù):傳給外部程序的參數(shù)(必須要放在數(shù)組里面)
- 第三個(gè)參數(shù):回調(diào)函數(shù),在回調(diào)中可以回去外部程序的執(zhí)行結(jié)果
shell
publishAllDocs.sh 主意:此處說明的都是非window下的shell腳本 window的.bat腳本不在此處講解
#$1文檔最外層目錄 $2當(dāng)前修改的文件名 $3當(dāng)前修改文件的目錄 cd $(pwd)/gitlib/docs/$1 echo "come in" for item in $2; do echo "${item}" cp -f ${item} ${item/docBackup/docs} done # echo "初始化進(jìn)入" 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 "復(fù)制文檔" cp -rf ./_book/* ../../../public/docs/$1 fi
參數(shù)接收
- 根據(jù)業(yè)務(wù)調(diào)用時(shí)傳參的數(shù)據(jù)來獲取參數(shù)
- 直接使用"$"來獲取
- 獲取順序就是數(shù)據(jù)傳入順序
- 切記不是數(shù)組角標(biāo)的取值 數(shù)組第一個(gè)參數(shù)就是$1
for循環(huán)的使用
在shell使用for…in的形式
需要循環(huán)的循環(huán)體數(shù)據(jù)示例
"/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腳本里面的循環(huán)體的數(shù)據(jù)比較特殊不是我們常規(guī)的數(shù)組或者json
直接就是以空格隔開的一個(gè)字符串 如: “a b c d e”
## $2就是腳本里面接收的業(yè)務(wù)的傳參 按格式拼接好的數(shù)據(jù) 如上面數(shù)據(jù)示例 ## 循環(huán)使用 for...in 記得;后面一定要加上do去執(zhí)行循環(huán)體 最后使用done結(jié)束循環(huán) ## item循環(huán)體的每個(gè)子項(xiàng) 如:/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 詳細(xì)解釋請(qǐng)看下面的shell字符串替換
shell指定字符串替換
在JS里面我們可以使用replace去做字符串的替換,那么shell里面改如何實(shí)現(xiàn)?
示例:
string “abc12342341”
- echo ${string/23/bb} //abc1bb42341 替換一次
- echo ${string//23/bb} //abc1bb4bb41 雙斜杠替換所有匹配
- echo ${string/#abc/bb} //bb12342341 #以什么開頭來匹配,根php中的^有點(diǎn)像
- echo ${string/%41/bb} //abc123423bb %以什么結(jié)尾來匹配,根php中的$有點(diǎn)像
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 "復(fù)制文檔" cp -rf ./_book/* ../../../public/docs/$1 fi
注意
- 條件判斷里面字符串要使用""雙引號(hào)
- 如果條件判斷里面有變量(字符串) 變量也要添加""雙引號(hào)
- 條件判斷[]后面要加上;并且一點(diǎn)要使用then才能繼續(xù)執(zhí)行
- 條件判斷最后要使用fi結(jié)尾
到此這篇關(guān)于node中使用shell腳本的方法步驟的文章就介紹到這了,更多相關(guān)node使用shell腳本內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用node.js實(shí)現(xiàn)接口步驟詳細(xì)記錄
這篇文章主要給大家介紹了關(guān)于使用node.js實(shí)現(xiàn)接口步驟的相關(guān)資料,對(duì)于剛開始不會(huì)node寫接口和調(diào)用接口,可以通過這個(gè)清晰的初步了解到整個(gè)過程,下面需要的朋友可以參考下2023-03-03node.js 中間件express-session使用詳解
這篇文章主要給大家介紹了node.js中間件express-session使用的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2017-05-05pnpm實(shí)現(xiàn)依賴包共享和依賴包項(xiàng)目隔離的方法詳解
pnpm是Node.js的包管理器,它是 npm 的直接替代品,相對(duì)于npm和yarn它的優(yōu)點(diǎn)就在于速度快和高效節(jié)省磁盤空間,本文主要講解pnpm相比于npm/yarn如何利用軟硬鏈接來節(jié)省磁盤空間,以及如何實(shí)現(xiàn)依賴包共享和依賴包項(xiàng)目隔離的,需要的朋友可以參考下2024-05-05Node.js REPL (交互式解釋器)實(shí)例詳解
這篇文章主要介紹了Node.js REPL (交互式解釋器)實(shí)例詳解的相關(guān)資料,Node.js REPL(Read Eval Print Loop:交互式解釋器) 表示一個(gè)電腦的環(huán)境,類似 Window 系統(tǒng)的終端,我們可以在終端中輸入命令,并接收系統(tǒng)的響應(yīng),需要的朋友可以參考下2017-08-08Node.js中module.exports?和exports使用誤區(qū)
本文主要介紹了Node.js中module.exports?和exports使用誤區(qū),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01使用nodeJs來安裝less及編譯less文件為css文件的方法
這篇文章主要介紹了使用nodeJs來安裝less及編譯less文件為css文件的方法,在文章末尾給大家補(bǔ)充介紹了通過nodejs將less文件轉(zhuǎn)為css文件的方法,具體內(nèi)容詳情大家通過本文學(xué)習(xí)吧2017-11-11