我正在运行来自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)
答案 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 });