2012-07-20 27 views
3

我正在嘗試想出一個解決方案來爲腳本執行一些數學函數,因爲bash顯然不能做除整數數學之外的其他任何事情(或者可以即使這樣做?)。如何在Bash腳本中將C++程序的輸出作爲變量使用

我想出來的腳本需要編寫一系列最終將用於模擬程序的宏。我目前只是試圖輸出用作宏參數的粒子源的位置。

的C++程序我寫的是很簡單的,它發生在我和輸出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

那麼,你是否讓你的腳本工作?下面的答案是否有幫助? – phonetagger 2012-10-05 16:04:19

回答

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

+0

+1 - 很好的答案。爲什麼'-ra'而不是'-a'? – 2012-07-20 01:36:32

+0

[手冊頁](http://ss64.com/bash/read.html)對'-a'的說法:「這些詞被分配給數組變量名的連續索引,從0開始。」這樣,我們可以放心'$ {values [0]}'是第一個數字,'$ {values [1]}'是第二個數字。更重要的是,我使用'-ra'來代替別的東西,並且複製粘貼使我的生活更輕鬆;) – cegfault 2012-07-20 01:39:46

+0

糟糕 - 我的意思是'-a'並編輯了我的評論。如果您更新了答案,我會刪除此評論! – 2012-07-20 01:41:59

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 
+0

我喜歡這個;看起來比我的解決方案更優雅一點(單行者讓世界變得全面) – cegfault 2012-07-20 01:47:45

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」的一部分。

相關問題