将值从C++程序返回到bash脚本

don*_*ton 6 c++ linux bash batch-file return-value

我有一个计算双重结果的C++程序(在Linux上),我想编写一个bash脚本,它运行程序的次数可变,并为我平均这些结果.为简单起见,请考虑以下代码:

main.cpp中:

int main() {
    cout << "Some other stuff\n";

    double result = foo();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

script.sh:

sum = 0
num = $1
for((i = 0; i < $num; i++)); do
    result = ./a.out;  #store the result somehow?
    sum = $sum + $result
done
avg = $sum / $num
echo "Average: " $avg
Run Code Online (Sandbox Code Playgroud)

有没有一种简单的方法可以将程序的结果传回bash脚本?我读到了使用退出代码,但返回类型是一个双,所以我认为这不会起作用.从字符串输出中解析值是不实用的,因为程序具有其他终端输出.

tha*_*guy 10

UNIX的方法是在stderr上写入非必要数据并在stdout上写入实际结果.这样,你就可以做到

int main() {
    cerr << "This is output that won't be captured." << endl;
    cout << "3.141592" << endl; 
}
Run Code Online (Sandbox Code Playgroud)

并使用命令替换来捕获它:

result=$(./a.out)
Run Code Online (Sandbox Code Playgroud)

一个更丑陋的方法是不需要更改输出就是写入另一个文件描述符:

int main() { 
    char* foo = "3.141592\n";
    write(42, foo, strlen(foo));
}
Run Code Online (Sandbox Code Playgroud)

这将让您捕获输出:

result=$(./a.out 42>&1 > /dev/null)
Run Code Online (Sandbox Code Playgroud)

请注意,您的shell脚本有几个语法错误.尝试使用shellcheck自动整理其中的许多内容,并随时发布有关您无法解决的问题的问题.


ver*_*hov 5

为什么不使用返回值作为 bash 脚本的数据?

int main() {
        return 46;
}
Run Code Online (Sandbox Code Playgroud)

输出如下(是的,它是 bash 脚本):

./a.out ; echo $?
46
Run Code Online (Sandbox Code Playgroud)

如果是双值,您可以使用这种方法:

#include <iostream>

int main() {
        double res = 46.001;
        std::cout << res << std::endl;
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

和输出:

a=`./a.out`; echo $a
46.001
Run Code Online (Sandbox Code Playgroud)