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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 02:48:11