如何将Shell脚本for循环的每个输出传入C++程序逐一运行
解决Shell脚本传递参数给C++程序的问题
核心思路
你之前的问题是搞反了调用逻辑:应该由Shell脚本控制循环,每次循环运行一次C++程序并传入对应参数,而不是在C++程序里调用Shell脚本。以下提供两种可行方案:
方案一:通过管道传递输入(无需修改C++程序)
如果不想改动C++代码,只需修改Shell脚本,将需要的参数通过管道传给程序的标准输入,替代手动输入。
修改后的Shell脚本(script.sh)
# 遍历所有任务数和用户数的组合 for NoofTasks in {1..6}; do for NoofUsers in {1..3}; do # 依次输出任务数和用户数(对应C++中两次cin的顺序) # 通过管道将这两个值传给编译后的C++程序(假设程序名为my_program) echo -e "$NoofTasks\n$NoofUsers" | ./my_program done done
说明
- 原脚本的两个独立循环会先输出所有任务数,再输出所有用户数,无法匹配C++程序需要的「先任务数、后用户数」的输入顺序,因此改成嵌套循环,确保每组参数对应一次程序运行。
echo -e "$NoofTasks\n$NoofUsers"会生成两行输出,正好对应C++中两次cin的读取。
方案二:修改C++程序接收命令行参数(更推荐)
这种方式更规范高效,避免处理程序的输入提示,直接通过命令行参数传递数值。
修改后的C++代码
#include <iostream> #include <vector> #include <cstdlib> using namespace std; // 假设你的rand_normal函数已实现 double rand_normal(double mean, double stddev) { // 这里写你的随机数生成逻辑,示例返回一个测试值 return mean + stddev; } int main(int argc, char* argv[]) { // 检查参数数量是否正确 if (argc != 3) { cerr << "用法: " << argv[0] << " <任务数> <用户数>" << endl; return 1; } // 将命令行参数转为整数 int NoOfTasks = atoi(argv[1]); int NoOfUsers = atoi(argv[2]); cout << " The list of periodicity values for " << NoOfTasks << " tasks are:" << '\n'; // 注意:C++标准不支持变长数组(int periodicity[NoOfTasks]),改用vector更安全 vector<int> periodicity(NoOfTasks); for (int i=0; i<NoOfTasks; ++i) { periodicity[i] = rand_normal(15,1.6); cout << periodicity[i] << '\n'; } // 后续计算逻辑... return 0; }
对应的Shell脚本(script.sh)
for NoofTasks in {1..6}; do for NoofUsers in {1..3}; do # 直接将参数作为命令行参数传给程序 ./my_program "$NoofTasks" "$NoofUsers" done done
说明
- 命令行参数通过
argc(参数数量)和argv(参数数组)获取,atoi用于将字符串参数转为整数。 - 用
vector替代变长数组,符合C++标准,避免潜在的内存问题。
为什么之前的方法无效?
你之前在C中调用system("script.sh"),只会让Shell脚本在终端输出数值,但这些输出不会自动成为C程序的输入,逻辑完全颠倒了。正确的做法是由Shell脚本主导,主动调用C++程序并传递参数。
内容的提问来源于stack exchange,提问作者Sreyashi Mukherjee
相关产品推荐
相关产品推荐

