一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務(wù)器之家 - 編程語言 - JavaScript - node.js - node中使用shell腳本的方法步驟

node中使用shell腳本的方法步驟

2022-02-20 17:32淺夏晴空 node.js

這篇文章主要介紹了node中使用shell腳本的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

背景

在開發(fā)中我們在特定的場合下可能需要一些腳本來批量處理我們的業(yè)務(wù)邏輯,在nodejs如何調(diào)用shell腳本呢?

新建

項目下新建腳本文件

?
1
touch newFile.sh

修改文件權(quán)限

?
1
chmod 777 newFile.sh 修改文件為可讀可寫可執(zhí)行

nodejs調(diào)用

文件讀取

?
1
2
3
//使用nodejs的子進(jìn)程里面的文件讀取方法
 
const { execFile } = require(‘child_process');

示例

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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í)行成功會返回腳本執(zhí)行的命令

node中使用shell腳本的方法步驟

execFile

  • 第一個參數(shù):要調(diào)用的外部程序,這里是要讀取的文件
  • 第二個參數(shù):傳給外部程序的參數(shù)(必須要放在數(shù)組里面)
  • 第三個參數(shù):回調(diào)函數(shù),在回調(diào)中可以回去外部程序的執(zhí)行結(jié)果

shell

publishAllDocs.sh 主意:此處說明的都是非window下的shell腳本 window的.bat腳本不在此處講解

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#$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ù)據(jù)來獲取參數(shù)
  • 直接使用"$"來獲取
  • 獲取順序就是數(shù)據(jù)傳入順序
  • 切記不是數(shù)組角標(biāo)的取值 數(shù)組第一個參數(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

直接就是以空格隔開的一個字符串 如: “a b c d e”

?
1
2
3
4
5
6
7
8
9
## $2就是腳本里面接收的業(yè)務(wù)的傳參 按格式拼接好的數(shù)據(jù) 如上面數(shù)據(jù)示例
## 循環(huán)使用 for...in 記得;后面一定要加上do去執(zhí)行循環(huán)體 最后使用done結(jié)束循環(huán)
## item循環(huán)體的每個子項 如:/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ì)解釋請看下面的shell字符串替換

shell指定字符串替換

在JS里面我們可以使用replace去做字符串的替換,那么shell里面改如何實現(xiàn)?

示例:

string “abc12342341”

  • echo ${string/23/bb} //abc1bb42341 替換一次
  • echo ${string//23/bb} //abc1bb4bb41 雙斜杠替換所有匹配
  • echo ${string/#abc/bb} //bb12342341 #以什么開頭來匹配,根php中的^有點像
  • echo ${string/%41/bb} //abc123423bb %以什么結(jié)尾來匹配,根php中的$有點像

if條件判斷的使用

語法

?
1
2
3
4
5
if[];then
 ...
else
 ...
fi

示例

?
1
2
3
4
5
6
7
8
9
10
11
12
## 條件判斷是使用[]而不是()
## []后面要加;
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

注意

  • 條件判斷里面字符串要使用""雙引號
  • 如果條件判斷里面有變量(字符串) 變量也要添加""雙引號
  • 條件判斷[]后面要加上;并且一點要使用then才能繼續(xù)執(zhí)行
  • 條件判斷最后要使用fi結(jié)尾

到此這篇關(guān)于node中使用shell腳本的方法步驟的文章就介紹到這了,更多相關(guān)node使用shell腳本內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://blog.csdn.net/gongch0604/article/details/112269257

延伸 · 閱讀

精彩推薦
  • node.jsrequire加載器實現(xiàn)原理的深入理解

    require加載器實現(xiàn)原理的深入理解

    這篇文章主要給大家介紹了關(guān)于require加載器實現(xiàn)原理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需...

    隱冬8462022-03-03
  • node.jsNode.js ObjectWrap 的弱引用問題

    Node.js ObjectWrap 的弱引用問題

    最近在寫 Node.js Addon 的過程中,遇到了一個問題,然后發(fā)現(xiàn)是 ObjectWrap 弱引用導(dǎo)致的,本文介紹一下具體的問題和排查過程,以及 ObjectWrap 的使用問題。...

    編程雜技9852022-01-04
  • node.jsnodejs中使用worker_threads來創(chuàng)建新的線程的方法

    nodejs中使用worker_threads來創(chuàng)建新的線程的方法

    這篇文章主要介紹了nodejs中使用worker_threads來創(chuàng)建新的線程的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友...

    flydean程序那些事8982022-01-06
  • node.jslinux服務(wù)器快速卸載安裝node環(huán)境(簡單上手)

    linux服務(wù)器快速卸載安裝node環(huán)境(簡單上手)

    這篇文章主要介紹了linux服務(wù)器快速卸載安裝node環(huán)境(簡單上手),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需...

    mose-x8462022-01-22
  • node.js詳解node.js創(chuàng)建一個web服務(wù)器(Server)的詳細(xì)步驟

    詳解node.js創(chuàng)建一個web服務(wù)器(Server)的詳細(xì)步驟

    這篇文章主要介紹了詳解node.js創(chuàng)建一個web服務(wù)器(Server)的詳細(xì)步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,...

    王佳斌8952021-12-31
  • node.jsk8s node節(jié)點重新加入master集群的實現(xiàn)

    k8s node節(jié)點重新加入master集群的實現(xiàn)

    這篇文章主要介紹了k8s node節(jié)點重新加入master集群的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋...

    Scarborought13922022-01-22
  • node.jsNode.js 中如何收集和解析命令行參數(shù)

    Node.js 中如何收集和解析命令行參數(shù)

    這篇文章主要介紹了Node.js 中如何收集和解析命令行參數(shù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋...

    descire8802021-12-28
  • node.js在瀏覽器中,把 Vite 跑起來了!

    在瀏覽器中,把 Vite 跑起來了!

    大家好,我是 ssh,前幾天在推上沖浪的時候,看到 Francois Valdy 宣布他制作了 browser-vite[1],成功把 Vite 成功在瀏覽器中運行起來了。這引起了我的興趣,如...

    前端從進(jìn)階到入院9282022-01-11
主站蜘蛛池模板: 欧美四级无删版影片 | 青草园网站在线观看 | 亚洲www在线 | 国产亚洲福利一区二区免费看 | 欧美精品一区二区在线观看播放 | 无遮无挡免费视频 | 国产精品久久久久久福利 | 国产亚洲视频在线 | 深夜影院深a | 亚洲精品中文字幕在线 | 无限韩国视频免费播放 | 日本精品一区二区在线播放 | 欧美vpswindowssex 欧美va在线高清 | 免费看h片的网站 | 日韩欧美一区黑人vs日本人 | 黄绝一级 | 免费看一区二区三区 | 国产性片在线观看 | 天堂在线观看中文字幕 | 精品国产乱码久久久人妻 | 午夜伦伦电影理论片费看 | 2021海角社区最新版 | 国产精品中文 | 高跟丝袜人妖sissy露出调教 | 午夜爱爱爱爱爽爽爽视频网站 | 国产日产国无高清码2020 | se婷婷| 热久久99精品这里有精品 | 特级一级全黄毛片免费 | 亚洲成人免费 | 按摩师他揉我奶好爽捏我奶 | 亚洲 欧美 日韩 综合 | 男gay网站视频免费观看 | 大奶妈咪女教师 | 欧美巨胸 | 久久视热频国产这里只有精品23 | 国产精品免费一级在线观看 | 91精品国产人成网站 | 成年男女免费大片在线观看 | 国产99精品成人免费视频 | 99热国产这里只有精品99 |