乐趣区

关于node.js:node中使用shell脚本

背景

在开发中咱们在特定的场合下可能须要一些脚本来批量解决咱们的业务逻辑,在 nodejs 如何调用 shell 脚本呢?

新建

  1. 我的项目下新建脚本文件

    touch newFile.sh

  2. 批改文件权限

    chmod 777 newFile.sh 批改文件为可读可写可执行

nodejs 调用

文件读取

// 应用 nodejs 的子过程外面的文件读取办法

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, fileName, docbackPath: docbackList, username, pathName, docType})
          unblockFile({docName, username, pathName, reg});
      }
  }) 
}

回调

执行胜利会返回脚本执行的命令

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 外面改如何实现?

示例:

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 结尾
退出移动版