如何在shell脚本文件中访问节点JS(javascript)变量

时间:2017-05-19 08:30:07

标签: javascript node.js shell

我正在运行来自nodeJS文件的shell脚本文件我需要将一些参数发送到shell脚本并在shell脚本中使用它

我的js文件

var dbname = development.db.uri;
    console.log(dbname);
    var myscript = exec('sh ./scripts/mongo-backup.sh'+ dbname );
    myscript.stdout.on('data',function(data){
        console.log("!@#$%^&*&@#$%^&*$##$%^&*")
        console.log(data); // process output will be displayed here
    });
    myscript.stderr.on('data',function(data){
        console.log(data); // process error output will be displayed here
    });

这是我的shell脚本

#!/bin/bash
echo "Creating Database Backup"
#need to access dbname from JS FILE
MONGO_DATABASE= dbname 
APP_NAME="app-name"
USERNAME=$(sudo echo $USER)

2 个答案:

答案 0 :(得分:1)

虽然它可能是可能的,但代码混合看起来很直观。我建议为dbname设置环境变量,nodejs将使用process.env.dbname捕获它,bash脚本将使用$dbname捕获它。

如果你坚持当前的结构,只需这样做:

var myscript = exec('DB_NAME='+ dbname + ' DB_USER=' + dbuser +' sh ./scripts/mongo-backup.sh');

如果您使用的是相当现代的节点,则可以使用以下语法:

var myscript = exec(`DB_NAME=${dbname} DB_USER=${dbuser} sh ./scripts/mongo-backup.sh`);

并在bash文件中

#!/bin/bash
echo "Creating Database Backup"
MONGO_DATABASE= $DB_NAME 
APP_NAME="app-name"
USERNAME=$(sudo echo $USER)

答案 1 :(得分:1)

这根本不起作用:

var myscript = exec('sh ./scripts/mongo-backup.sh',+ dbname );

因为它试图从dbname(一元加运算符)中产生一个最有可能导致NaN然后它传递的数字作为exec的第二个参数(应该是可选的)选项对象)。

你的意思是:

var myscript = exec('sh ./scripts/mongo-backup.sh ' + dbname);

需要注意的另一件事是,您的脚本被声明为Bash脚本,并且您使用sh显式运行它而不是bash。某些系统上的sh命令可能与Bash不兼容 - 例如有时它是Dash或其他一些简单的shell,所以这样更好:

var myscript = exec('bash ./scripts/mongo-backup.sh ' + dbname);

这会将它作为参数传递给脚本,您可以在shell脚本中以$1的形式访问该脚本:

#!/bin/bash
echo $1

或类似于您的示例:

#!/bin/bash
MONGO_DATABASE=$1
# use $MONGO_DATABASE as you need

您可以使用spawn执行类似的操作而不使用字符串连接:

var myscript = spawn('bash', ['./scripts/mongo-backup.sh', dbname]);

如果dbname中的某个字符被shell误解为某个特殊字符,则不会中断。这不太可能,但需要加以考虑。

您还可以将变量作为环境变量传递给shell脚本,以便可以直接使用命名变量。例如:

var env = Object.assign({}, process.env, { dbname });
var myscript = spawn('bash', ['./scripts/mongo-backup.sh'], { env });

现在您可以在shell脚本中使用$dbname,例如:

#!/bin/bash
echo $dbname

或类似于您的示例:

#!/bin/bash
MONGO_DATABASE=$dbname
# use $MONGO_DATABASE as you need

您也可以直接传递MONGO_DATABASE:

var env = Object.assign({}, process.env, { MONGO_DATABASE: dbname });
var myscript = spawn('bash', ['./scripts/mongo-backup.sh'], { env });

只需在脚本中使用它,不需要其他变量:

#!/bin/bash
echo $MONGO_DATABASE

您可以使用环境变量或参数将数据传递到shell脚本。有时一个更方便,有时另一个。

有关详细信息,请参阅文档:

更新

您可以使用空格发送多个参数,以使用$1$2$3

var myscript =
  exec('bash ./scripts/mongo-backup.sh ' + dbname + ' ' + dbuser + ' ' + dbpass);

与上述内容相同但使用反叛,使用$1$2$3

var myscript =
  exec(`bash ./scripts/mongo-backup.sh ${dbname} ${dbuser} ${dbpass}`);

与上述相同但没有字符串连接,使用$1$2$3

var myscript =
  spawn('bash', ['./scripts/mongo-backup.sh', dbname, dbuser, dbpass]);

或作为环境变量传递,用作$dbname $dbuser $dbpass

var env = Object.assign({}, process.env, { dbname, dbuser, dbpass });
var myscript = spawn('bash', ['./scripts/mongo-backup.sh'], { env });