2017-07-29 99 views
0

這個bash腳本應該做到以下幾點:從文件擊:保存Python代碼的結果bash腳本,並寫入結果到文件

1)讀入兩個值,suscexp_transpostprocessing.txt

2)將這兩個值作爲命令行輸入傳遞給Python程序postproc.py

3)將postproc.py的結果保存爲varval。這是三個值的列表。

4)創建一個文件頭文件M1, M2, M3,並在其下寫下varval值。

一路上有一些cd,但我沒有得到我期望的。這是我想到:

M1 M2 M3 
[[4.0], [2.2799999999999998], [0.56000000000000005]] 
[[5.3], [2.1111111111111111], [0.59111111111111111]] 

這裏就是我得到:

[[4.0], [2.2799999999999998], [0.56000000000000005]] 
M1,M2,M3 
[[4.0], [2.2799999999999998], [0.56000000000000005]] 
./postproc.sh: line 6: [[4.0], [2.2799999999999998], [0.56000000000000005]]+1: syntax error: operand expected (error token is "[[4.0], [2.2799999999999998], [0.56000000000000005]]+1" 

那麼清楚什麼是錯用,我怎麼迭代,因爲我只能從postproc.py,而不是兩個得到一個結果。我認爲錯誤在於此行:varval=$(python ../postproc.py --susc $a1 --exp_trans $b1 2>&1)

有誰知道如何將結果保存在bash中的循環中,然後將它們寫入文件?

我的bash代碼:

#/bin/bash 

i=0 
while read a1 b1 
    do 
    i=$(($i+1)) 
    cd RUN_EXP$i 
    varval=$(python ../postproc.py --susc $a1 --exp_trans $b1 2>&1) 
    echo $varval 
    cd .. 
    echo M1,M2,M3 
     for i in "${varval[@]}" 
     do 
       echo $i 
     done 
    done < postprocessing.txt 

編輯

這不只是i被覆蓋(雖好抓,謝謝!)。根據Veselin Ivanov和下面鼠腦的答案確定後,產出仍然不太正確。

至今代碼:

#/bin/bash 

i=0 
echo M1,M2,M3 
while read a1 b1 
    do 
    i=$(($i+1)) 
    cd RUN_EXP$i 
    varval=$(python ../postproc.py --susc $a1 --exp_trans $b1 2>&1) 
    echo $varval 
    cd .. 
     for j in "${varval[@]}" 
     do 
       echo $j 
     done 
    done < postprocessing.txt 

輸出:

M1,M2,M3 
[[4.0], [2.2799999999999998], [0.56000000000000005]] 
[[4.0], [2.2799999999999998], [0.56000000000000005]] 
[[5.3], [2.1111111111111111], [0.59111111111111111]] 
[[5.3], [2.1111111111111111], [0.59111111111111111]] 
+0

'for i in「$ {varval [@]}」'真的嗎? –

+0

你爲什麼要用../運行你的python腳本?你可不可以放一個#!在你的Python腳本中將它指向Python可執行文件? –

+0

@ IgnacioVazquez-Abrams真的真的......有另一種方式嗎? – StatsSorceress

回答

0

你的問題是,您再次使用變量和第二次運行它是一個字符串不是一個integer.Just的J將其重命名,例如像這樣:

#/bin/bash 

i=0 
while read a1 b1 
    do 
    i=$(($i+1)) 
    cd RUN_EXP$i 
    varval=$(python ../postproc.py --susc $a1 --exp_trans $b1 2>&1) 
    echo $varval 
    cd .. 
    echo M1,M2,M3 
     for j in "${varval[@]}" 
     do 
       echo $j 
     done 
    done < postprocessing.txt 

編輯:

如果你想用一個數組來完成它並在一個單獨的行中打印每個條目(我假設你想這樣做),那麼這是一種方法。

#/bin/bash 

i=0 
echo M1,M2,M3 
while read a1 b1 
    do 
    i=$(($i+1)) 
    cd RUN_EXP$i 
    varval=$(python ../postproc.py --susc $a1 --exp_trans $b1 2>&1) 

    field1=$(echo $varval|cut -d ',' -f1) 
    field2=$(echo $varval|cut -d ',' -f2) 
    field3=$(echo $varval|cut -d ',' -f3) 

    values=($field1,$field2,$field3) 
    cd .. 
    echo M1,M2,M3 
     for j in "${values[@]}" 
     do 
       echo $j 
     done 
    done < postprocessing.txt 
+0

謝謝,但那不是唯一的錯誤。請參閱更新。 – StatsSorceress

+1

那麼,如果你擔心冗餘條目,因爲你打印$ varval和$ j具有相同的值。 –

0

看起來你是在重複使用它循環覆蓋變量i。此外,標題的回顯應該在while循環之前。