从NodeJS执行Bash/Shell脚本时如何正确传递参数?
解决exec传递参数到shell脚本为空的问题
看起来你遇到的核心问题是Node.js的exec方法参数传递方式错误,导致shell脚本没收到正确的req.body.deletedCert值。咱们一步步来修正:
1. 错误原因分析
- 你第一种写法:
exec('sh cert-check-script-delete.sh', req.body.deletedCert);
这里exec的第二个参数是配置选项(比如环境变量、工作目录等),不是传递给脚本的参数,所以脚本里的$1自然拿不到值。 - 第二种写法:
exec('sh cert-check-script-delete.sh' + req.body.deletedCert)
这种字符串拼接方式如果参数包含空格、引号等特殊字符会直接失效,而且即使参数是纯文本,也需要在脚本名和参数之间加空格,否则会把参数当成脚本名的一部分,同样拿不到正确值。
2. 正确的解决方案
推荐使用exec的数组参数形式(或者更安全的execFile)来传递参数,避免字符串拼接的问题:
方法一:使用exec的数组格式
const { exec } = require('child_process'); // 把命令和参数拆成数组,参数作为数组的后续元素 exec('sh', ['cert-check-script-delete.sh', req.body.deletedCert], (error, stdout, stderr) => { if (error) { console.error(`执行错误: ${error.message}`); return; } if (stderr) { console.error(`脚本错误输出: ${stderr}`); return; } console.log(`脚本执行结果: ${stdout}`); });
方法二:使用更安全的execFile
execFile专门用来执行可执行文件,不需要通过shell解析,参数传递更安全:
const { execFile } = require('child_process'); // 第一个参数是脚本路径,第二个是参数数组 execFile('./cert-check-script-delete.sh', [req.body.deletedCert], (error, stdout, stderr) => { if (error) { console.error(`执行错误: ${error.message}`); return; } if (stderr) { console.error(`脚本错误输出: ${stderr}`); return; } console.log(`脚本执行结果: ${stdout}`); });
3. 脚本的小优化
另外,为了避免参数包含空格时被拆分,建议在脚本里给$1加引号:
#!/bin/sh certs_json="./certs.json" # 更清晰的变量名 echo -e "$1" >> "$certs_json" # 给$1和文件名加双引号,处理特殊字符
这样修改后,脚本就能正确接收到req.body.deletedCert的值并写入文件了。
内容的提问来源于stack exchange,提问作者tnoel999888
相关产品推荐
相关产品推荐

