You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:27:34