1. 程式人生 > 程式設計 >node中使用shell指令碼的方法步驟

node中使用shell指令碼的方法步驟

背景

在開發中我們在特定的場合下可能需要一些指令碼來批量處理我們的業務邏輯,在nodejs如何呼叫shell指令碼呢?

新建

專案下新建指令碼檔案

touch newFile.sh

修改檔案許可權

chmod 777 newFile.sh 修改檔案為可讀可寫可執行

nodejs呼叫

檔案讀取

程式設計客棧
//使用nOIlgnHvVdnodejs的子程序裡面的檔案讀取方法

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,docbackPath: docbackList,username,docType }) unblockFile({ docName,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/dOIlgnHvVdnocServer/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結尾

到此這篇關於node中使用shell指令碼的方法步驟的文章就介紹到這了,更多相關node使用shell指令碼內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!