如何在Bash脚本中使用C ++程序的输出作为变量

时间:2012-07-20 01:16:59

标签: c++ scripting

我正在尝试为脚本执行一些数学函数,因为bash显然除了整数数学之外不能做任何事情(或者甚至可以做到这一点?)。

我想出的脚本需要编写一系列宏,这些宏最终将用于模拟程序。我目前只是想输出一个粒子源的位置,用作宏的参数。

我编写的C ++程序非常简单,它接受i并输出x和y:

#include <iostream>
#include <math.h>

using namespace std;

int main()
{
  double i;
  double theta = 11 * (3.1415926535897932384626/180);

  cin >> i;

  double b = 24.370;

  double y = (b/i)*sin(theta);
  double x = (b/i)*cos(theta);

  cout << x << " " <<  y << endl;

  return 0;
}

我正在编写的脚本输出了一些与我正在尝试创建的宏有关的东西,但是我坚持使用的行(标记为(1))需要做类似的事情。 ..

for i in {1..100}
do
  echo "./a.out" #calling the C program
  echo "$i" #entering i as input

  x = first output of a.out, y = second output a.out #(1) Confused on how to do this part!

  echo -n "/gps/position $x $y 0 27.7 cm" > mymacro.mac

完成

我知道必须有一个非常简单的方法来做到这一点,但我不确定该怎么做。我基本上只需要使用c程序的输出作为脚本中的变量。

3 个答案:

答案 0 :(得分:3)

您应该考虑将$i作为变量传递给您的c ++程序,并使用argv将其读入(this可能会有所帮助)。这很可能是“正确”的方式。然后你可以将它用于bash:

#!/bin/bash
IFS=' ';
for i in {1..100}
do
    read -ra values <<< `./a.out $i`
    x=${values[0]}
    y=${values[1]}
    echo -n "/gps/position $x $y 0 27.7 cm" > mymacro.mac
done

并且您确定要> mymacro.mac而不是>> mymacro.mac(如果前者在循环内,则只将最后一个值写入文件mymacro.mac

答案 1 :(得分:1)

您可以使用cegfault的答案,或者更简单:

read val1 val2 <<< $(./a.out $i)

执行a.out并将这两个数字存储在$val1$val2中。

您可能会发现使用awk更容易,它会处理浮点数和大多数数学函数。这是一个任意的例子:

bash> read x y <<< $(echo 5 | awk '{ printf "%f %f\n", cos($1), sin($1) }')
bash> echo $x
0.283662
bash> echo $y
-0.957824

答案 2 :(得分:0)

如果您的脚本将存在很长时间或者需要处理大量数据,特别是因为您无论如何都要在C ++程序中编写部分功能,那么您可能会更好地编写整个脚本在C ++中的东西,最终的结果将快得多......而且更集中和更多更容易看出发生了什么。

#include <iostream>
#include <math.h>
#include <sstream>
#include <fstream>

int main()
{
  const double theta = 11 * (3.1415926535897932384626/180);
  const double b = 24.370;

  for (int n=1; n<=100; ++n)
  {
    double i = n;
    double y = (b/i)*sin(theta);
    double x = (b/i)*cos(theta);

    // Two ways of sending the output to mymacro.mac......

    // 1. Via the system() call.....
    std::stringstream ss;
    ss << "echo -n \"/gps/position " << x << ' ' << y << " 0 27.7 cm\" > mymacro.mac";
    system(ss.str().c_str());

    // 2. Via C++ file I/O.....
    std::ofstream ofile("mymacro.mac");
    ofile << "/gps/position " << x << ' ' << y << " 0 27.7 cm";
    ofile.close(); //...not technically necessary; ofile will close when it goes out of scope.
  }
}

请注意,此解决方案以精确的保真度复制您的示例,包括在每次循环迭代时覆盖文件'mymacro.mac'的部分。