node中使用shell腳本

背景

在開發中咱們在特定的場合下可能須要一些腳原本批量處理咱們的業務邏輯,在nodejs如何調用shell腳本呢?php

新建

  1. 項目下新建腳本文件node

    touch newFile.sh
  2. 修改文件權限git

    chmod 777 newFile.sh 修改文件爲可讀可寫可執行

nodejs調用

文件讀取

//使用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

image-20210106112026570

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裏面改如何實現?

示例: session

string "abc12342341"less

  • 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

示例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

注意

  • 條件判斷裏面字符串要使用""雙引號
  • 若是條件判斷裏面有變量(字符串) 變量也要添加""雙引號
  • 條件判斷[]後面要加上;而且一點要使用then才能繼續執行
  • 條件判斷最後要使用fi結尾
相關文章
相關標籤/搜索