3

我试图想出一个解决方法来为脚本执行一些数学函数,因为 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

完毕

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

4

3 回答 3

3

您可能应该考虑将$i其作为变量传递给您的 c++ 程序并argv用于读取它(可能会有所帮助)。这很可能是“正确”的做法。然后你可以将它用于 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

于 2012-07-20T01:33:01.777 回答
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
于 2012-07-20T01:39:11.523 回答
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”的部分。

于 2012-07-20T01:50:26.673 回答