如何在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
相关产品推荐
相关产品推荐

