ノードでシェルスクリプトを使用する方法

ノードでシェルスクリプトを使用する方法

背景

開発中、特定の状況でビジネス ロジックをバッチ処理するためのスクリプトが必要になる場合があります。Node.js でシェル スクリプトを呼び出すにはどうすればよいでしょうか?

新しい

プロジェクトの下に新しいスクリプトファイルを作成する

newFile.sh をタッチします

ファイルの権限を変更する

chmod 777 newFile.sh はファイルを読み取り、書き込み、実行可能に変更します。

Nodejs呼び出し

ファイルの読み取り

//nodejs の子プロセスでファイル読み取りメソッドを使用します。const { execFile } = require('child_process');

DocsService.publishAllDocs = (req, res) => {
 要求セッションタッチ();
 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 ユーザー名 = req.session.user_name;
 var str = docName+'/'+ パス名 + '|'+ ユーザー名;
 var reg = new RegExp(`^(${str})`);
 saveDocsList.map((item, index)=>{
   fileArr = item.pathName.split("/");
   ファイル名 = fileArr[fileArr.length-1];
   if(docType == "docsify"){
     dirnameBack = fileName != "" ? `../../gitlib/docBackup/${docName}/docs/${item.pathName}`:`../../gitlib/docBackup/${docName}/docs/README.md`
   }それ以外{
     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 + " ";
 })
 ドキュメントパス += ""
 //cwd は現在のパスを設定します。ここで設定するのは、Node.js コードの現在の場所です。js execFile(filepath, [docName, docPath, docType], { cwd: '.' }, function(err, stdout, stderr){
   logger.info(標準出力);
   もしエラーが起きたら
     loggerFileError({user:username,docName:docName,pathName:'all',operate:"gitbook ファイルのワンクリックリリース",err});
     res.json({
       応答コード: -1,
       errMsg: 「ワンクリック公開に失敗しました」
     })
   }それ以外{
     res.json({
       応答コード: 0,
       メッセージ: 「ワンクリック公開に成功しました」
     })
     gitPush({ docName, ファイル名, docbackPath: docbackList, ユーザー名, パス名, docType })
     ファイルのブロックを解除します({ docName, ユーザー名, パス名, reg });
   }
 }) 
}

コールバック

正常に実行されると、スクリプトによって実行されたコマンドが返されます。

実行ファイル

  • 最初のパラメータ: 呼び出される外部プログラム、ここでは読み取られるファイルです
  • 2 番目のパラメータ: 外部プログラムに渡されるパラメータ (配列に配置する必要があります)
  • 3番目のパラメータ:外部プログラムの実行結果を返すことができるコールバック関数

シェル

publishAllDocs.sh 注: ここで説明する手順はすべて、Windows 以外のシェル スクリプトです。Windows の .bat スクリプトについてはここでは説明しません。

#$1 ドキュメントの最外部ディレクトリ$2 現在変更されているファイルの名前$3 現在変更されているファイルのディレクトリcd $(pwd)/gitlib/docs/$1
「入って」とエコーする
2ドルのアイテムの場合、
  echo "${item}"
  cp -f ${item} ${item/docBackup/docs}
終わり
# echo "初期化エントリ"
echo "$(pwd)/gitlib/docs/$1"
[ "$3" == "docsify" ] の場合;
  #指定されたディレクトリ内のファイルをコピーします。例: $1/$3/$2 docs/cst/7e4ce1de04621e0b/
  #例: cp -rf ../../docBackup/wireless/docs/cst/7e4ce1de04621e0b/10708d589eedfffd.md ./docs/cst/7e4ce1de04621e0b/
  cp -rf ./docs ../../../public/docs/$1
それ以外
  # gitbook タイプのドキュメントを処理する gitbook build
  echo "ドキュメントをコピー"
  cp -rf ./_book/* ../../../public/docs/$1
フィ

パラメータ受信

  • ビジネスコール中に渡されたデータに基づいてパラメータを取得します
  • 「$」を直接使用して取得する
  • 取得順序はデータが渡される順序です。
  • 配列の最初のパラメータは配列の添え字の値ではないことに注意してください。

forループの使用

シェルで for...in 形式を使用する

ループする必要があるループ本体データの例

"/users/desktop/work/docmanager/docserver/gitlib/docbackup/mygitbook/docs/d09985fc67088b35/d09985fc67088b35.md/user/user/deskop/docmanager/gitlib/doclib/doclib/docsup/dd 09985FC67088B35/D09985FC670888B35/6F7A2C61C9BAC0A3.MD/USERS/DESKTOP/WORK/DOCMANAGER/DOCSERVER/GITLIB/DOCBACKUP/MYGITBOOK/DADTOP/GIT/GIT/GIT/GIT/GIT/GIT/GIT/giT lib/docbackup/mygitbook/docs/d09985fc67088b35/d09985fc67088b35/6f7a2c61c9bac0a3.md "

シェルスクリプトのループ本体のデータは特別なものであり、通常の配列やjsonではありません。

これはスペースで区切られた文字列です。例: "abcde"

## $2 はスクリプトで受信され、上記のデータ例に示す形式で接合されたデータです。## ループでは for...in を使用します。その後に do を追加してループ本体を実行し、done でループを終了することを忘れないでください。## 項目ループ本体の各サブ項目は次のとおりです: /Users/Desktop/work/docManager/docServer/gitlib/docBackup/mygitbook/docs/d09985fc67088b35/d09985fc67088b35.md
2ドルのアイテムの場合、
  エコー "${item}"
  cp -f ${item} ${item/docBackup/docs}
終わり
## ${item/docBackup/docs} 文字列の置換## ここでは、アイテムパスの docBackup が docs に置き換えられます。詳細な説明については、以下のシェルの文字列の置換を参照してください。

シェル指定の文字列置換

JS では、 replace を使用して文字列を置き換えることができますが、シェルではどのように実装すればよいでしょうか?

例:

文字列 "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
 ...
それ以外
 ...
フィ

## 条件判断では()の代わりに[]を使用します
## [] は後に追加する必要があります。
[ "$3" == "docsify" ] の場合;
  #指定されたディレクトリ内のファイルをコピーします。例: $1/$3/$2 docs/cst/7e4ce1de04621e0b/
  #例: cp -rf ../../docBackup/wireless/docs/cst/7e4ce1de04621e0b/10708d589eedfffd.md ./docs/cst/7e4ce1de04621e0b/
  cp -rf ./docs ../../../public/docs/$1
それ以外
  # gitbook タイプのドキュメントを処理する gitbook build
  echo "ドキュメントをコピー"
  cp -rf ./_book/* ../../../public/docs/$1
フィ

知らせ

  • 条件判断の文字列には二重引用符を使用する必要があります
  • 条件判定に変数(文字列)がある場合は、変数も二重引用符で囲む必要があります。
  • 条件判断 [] の後には ; が続き、その後に を使用して実行を続行する必要があります。
  • 条件付き判断はfiで終わるべきである

ノードでシェル スクリプトを使用する方法と手順に関するこの記事はこれで終わりです。ノードでシェル スクリプトを使用する方法に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Node.js http モジュールの使用
  • Nodejs 探索: シングルスレッドの高並行性の原理を深く理解する
  • Node.jsを理解するのはとても簡単です
  • node.js グローバル変数の具体的な使用法
  • Node8 における AsyncHooks 非同期ライフサイクル
  • Nodejs エラー処理プロセス記録
  • Expressを使用してプロジェクトを自動的にビルドするNode.jsのプロセス全体
  • Node.js の TCP 接続処理のコア プロセス
  • Nodejs 配列キューと forEach アプリケーションの詳細な説明
  • Node.jsとDenoの比較

<<:  Linux サーバーで MySQL リモート接続を有効にする方法

>>:  Centos7でのMySQLインストールチュートリアル

推薦する

Linux(中心OS7)は、Java Webプロジェクトの実行環境を構築するためにJDK、Tomcat、MySQLをインストールします。

1. JDKをインストールする1. 古いバージョンまたはシステム独自のJDKをアンインストールする...

WeChatアプレットのオーディオコンポーネントがiOSで再生できない問題の解決策

解決策:クリック イベントをオーディオ コンポーネントにバインドし、再生メソッドと一時停止メソッドを...

順序再構築に関する簡単な説明: MySQL シャーディング

目次1. 目的2. 環境整備1. 基本情報2. データベース環境の準備3. データベースを構築し、サ...

知っておくべき JS 配列削減の高度な使い方 25 選

序文Reduce は ES5 で追加された新しい従来の配列メソッドの 1 つです。forEach、f...

DIV、テーブル、XHTML のウェブサイト構築の違いの分析と説明

簡単に言えば、ウェブサイト構築とは、「この人はどんな外見をしているのか」と「この人はどんな内面を持っ...

MySQLデータベースのマスタースレーブレプリケーションと読み取り書き込み分離に関する詳細なチュートリアル

目次序文1. MySQL マスタースレーブレプリケーション1. サポートされているレプリケーションの...

int(3)とint(10)の値の範囲はmysqlで同じですか?

目次質問:答え:現実:知識ポイント結論は:要約する質問: MySQLフィールド、unsigned i...

Linux で指定されたフォルダの各サブフォルダ内のファイル数を表示する

カウントスクリプト #!/bin/sh 引数の数=$# [ $numOfArgs -ne 1 ]の場...

CSS の Flex レイアウトを使用してシンプルな縦棒グラフを作成する方法

以下は、Flex レイアウトを使用した棒グラフです。 HTML: <div class=&qu...

VueでTypeScriptを使用する方法

導入近年、TypeScript を求める声がますます高まり、TypeScript はフロントエンドに...

MySQL データベースの基礎 SQL ウィンドウ関数の例の分析チュートリアル

目次導入導入集計関数 + over()ソート関数 + over() ntile() 関数 + ove...

Nginx タイムアウト設定の詳細な説明

最近、プロジェクトで nginx を使用し、バックエンドで Java を使用しました。バックエンドで...

JavaScript の Set データ構造の詳細な説明

目次1. セットとは何か2. セットコンストラクタ2.1) 配列2.2) 文字列2.3) 議論2.4...

Vue3 で状態管理を実装するために provide を使用する方法

目次序文provide/inject を通じて Vuex 関数を実装する方法このプラグインをアプリケ...

レスポンシブレイアウトについて知っておくべきこと

1. はじめにレスポンシブ Web デザインにより、Web サイトは複数のデバイスと複数の画面に同時...