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

如何在C++程序中将含空格的字符串变量传入Shell脚本

解决C++向Shell脚本传递含空格字符串被拆分的问题

问题原因

system()函数会把拼接后的命令字符串交给Shell解析,空格会被默认当作参数分隔符,导致原字符串被拆分成多个独立参数。

方法一:用引号包裹参数(修改system调用)

在C中将含空格的参数用双引号包裹,同时注意转义C字符串中的双引号:

修改后的C++代码:

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string cstmrAdrs = "ECit Jlrd blr KA";
    // 用转义双引号包裹参数,让Shell识别为单个参数
    string cmd = "/home/user/siteCheck/t.sh \"" + cstmrAdrs + "\"";
    int ret = system(cmd.c_str());
    cout << "ret = " << ret;
    return 0;
}

同时调整Shell脚本,推荐用"$1"(加引号避免后续特殊字符解析问题):

#!/bin/sh

echo "$1"

执行后输出会是完整字符串:

ECit Jlrd blr KA
ret = 0

方法二:使用exec系列函数(跳过Shell解析,更安全)

如果不想依赖Shell的命令解析逻辑,可通过fork()+execvp()组合直接传递参数数组,从根源避免空格拆分问题:

C++代码示例:

#include <iostream>
#include <unistd.h>
#include <sys/wait.h>

using namespace std;

int main()
{
    string cstmrAdrs = "ECit Jlrd blr KA";
    pid_t pid = fork();
    
    if (pid == 0) {
        // 子进程执行脚本,参数数组直接传递
        char* args[] = {
            (char*)"/home/user/siteCheck/t.sh",
            (char*)cstmrAdrs.c_str(),
            nullptr // 参数数组必须以nullptr结尾
        };
        execvp(args[0], args);
        // 若execvp返回则说明执行失败
        perror("execvp failed");
        _exit(1);
    } else if (pid > 0) {
        // 父进程等待子进程结束并获取返回值
        int status;
        waitpid(pid, &status, 0);
        cout << "ret = " << WEXITSTATUS(status);
    } else {
        perror("fork failed");
        return 1;
    }
    return 0;
}

Shell脚本依然用"$1"接收即可,这种方式无需处理Shell的引号转义,安全性更高,适合传递含特殊字符的参数。

内容的提问来源于stack exchange,提问作者Rndp13

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 07:40:08