如何将C++程序的cout输出捕获到Bash脚本变量中?
解决Bash捕获C++程序输出并计算平均值的问题
你的核心卡壳点出在输出捕获的语法错误上,咱们一步步拆解解决:
1. 为什么output=$(./prog) | bc -l会得到空值?
$(./prog)本身就会把C++程序的标准输出(也就是cout打印的内容)完整捕获到output变量里了,后面加的| bc -l完全是多余的——它是把捕获命令本身的输出(而不是程序的输出)传给bc,而捕获命令本身是没有输出的,所以这行等于白加,还可能让你误以为捕获失败。
正确的捕获写法就是直接:
output=$(./prog)
如果捕获还是空,先手动运行./prog确认终端能看到整数输出;如果程序有错误信息(比如用cerr打印的内容),这些不会被$()捕获,你可以用output=$(./prog 2>&1)把错误输出也合并进来,但最好确保C++程序只把需要的整数用cout输出,没有额外的调试字符或换行干扰。
2. 修正你的完整脚本(解决其他语法错误)
我把你脚本里的语法问题和逻辑问题一起修正了,直接用这个版本就能正常计算平均值:
count=1 while [ $count -le 8192 ]; do sum=0 arraysize=$(( count * 1024 )) # 编译C++程序,简化变量写法 g++-7 prog.cpp -DGLOBAL=${arraysize} -DLOCAL=32 -o prog -lm -fopenmp -framework OpenCL # 循环10次运行程序 for try in {0..9}; do # 捕获程序输出 output=$(./prog) # 加个简单判断,避免空值导致脚本崩溃 if [ -z "$output" ]; then echo "警告:第$try次运行未输出有效数值" continue fi echo "第$try次运行结果:${output}" # 累加求和(Bash整数运算) sum=$(( sum + output )) done # 计算并输出平均值 echo "10次运行总和:${sum}" echo "平均值(整数除法):$(( sum / 10 ))" # 如果需要浮点数平均值(保留2位小数) echo "平均值(浮点数):$(echo "scale=2; ${sum} / 10" | bc -l)" # 翻倍count进入下一轮 count=$(( count * 2 )) done
关键修正点说明:
- 修复了循环的语法错误:
count=1后要加分号/换行,while条件后也要加分号,do必须和条件分开 - 移除了多余的
| bc -l,只在计算浮点数平均值时使用bc - 增加了空值判断,避免程序输出异常导致脚本报错
- 简化了变量写法(比如
$(( $count * 1024 ))可以写成$(( count * 1024 )),变量在$(( ))里不需要加$) - 区分了整数和浮点数两种平均值计算方式,按需选择
3. 最后确认你的C++程序
确保cout输出的只有你需要的整数,没有额外的空格、换行或调试信息——比如用cout << your_integer << endl;或者直接cout << your_integer;,避免输出内容里混进非数字字符导致Bash的整数运算失败。
内容的提问来源于stack exchange,提问作者Alex Johnson
相关产品推荐
相关产品推荐

