Bash:将python代码的结果保存到bash脚本并将结果写入文件

时间:2017-07-29 19:58:05

标签: bash shell

这个bash脚本应该执行以下操作:

1)从文件susc中读入两个值exp_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和micebrain的答案确定后,输出仍然不太正确。

到目前为止的代码:

#/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]]

2 个答案:

答案 0 :(得分:0)

看起来你通过在for循环中重用它来覆盖变量i。标题的echo也应该在while循环之前。

答案 1 :(得分:0)

你的问题是你再次使用变量 i ,而在第二次运行时,它的字符串不是整数。只需用j重命名它,例如:

#/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

编辑:

如果你想用一个数组来做它并在一个单独的行中打印每个条目(我假设你想这样做),那么这是一种方法。

proxy.setHttpProxy("hostname:port");
proxy.setFtpProxy("hostname:port");
proxy.setSslProxy("hostname:port");
//proxy.setSocksUsername("username");
//proxy.setSocksPassword("password");
proxy.setAutodetect(false);
proxy.setProxyType(ProxyType.MANUAL);
capabilities.setCapability(CapabilityType.PROXY, proxy);