我正在尝试为脚本执行一些数学函数,因为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程序的输出作为脚本中的变量。
答案 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'的部分。