Estou tentando escrever um script para comparar resultados de um código com meus resultados já estabelecidos para testes de regressão

0

Eu tenho tentado escrever um script bash para executar meu código e comparar a saída final com uma execução anterior (com o resultado correto) em regression.dat. O objetivo é que ele me diga se o código converge no mesmo número de iterações de antes e se os resultados estão dentro de 0,1% dos resultados do benchmark no arquivo .dat. Até agora eu tenho recebido muitos erros de sintaxe, e mesmo quando eu me livrei deles, as variáveis reg1, reg2, reg3, etc. armazenavam apenas 0 como um valor

#!/bin/bash
rm *.dat
rm *.vtu
FiniteVolume.serial export FORT_FMT_RECL=250
mv finaloutput.dat regression
cd regression
readarray filecontent < regression_test.dat
echo $filecontent
readarray filecontent2 < finaloutput.dat
echo $filecontent2
((reg1=${filecontent[1]}))
((reg2=${filecontent[2]}))
((reg3=${filecontent[3]}))
((reg4=${filecontent[4]}))
echo reg1
echo $reg1

((exm1=${filecontent2[1]}))
((exm2=${filecontent2[2]}))
((exm3=${filecontent2[3]}))
((exm4=${filecontent2[4]}))

if ((reg1 = exm1)); then
     echo "iteration count is equal" 
elif ((sqrt((reg2- exm2)^2)/reg2 < 1e-1)) ; then
     echo "Lift coefficient error is less than .1 percent"
elif ((sqrt((reg2- exm2)^2)/reg2 > 1e-1)); then
     echo "Lift Coefficient test failed"
elif ((sqrt((reg3- exm3)^2)/reg3 < 1e-1)); then
     echo "Drag coefficient error is less then .1 percent"
elif ((sqrt((reg3- exm3)^2)/reg3 > 1e-1)); then
      echo "Drag Coefficient test failed"
elif ((sqrt((reg4- exm4)^2)/reg4 < 1e-1)); then
     echo "Residual error is less than .1 percent"
elif ((sqrt((reg2- exm2)^2)/reg2 > 1e-1)); then
     echo "Residual test failed"
fi

cd ..
rm *.dat
rm *.vtu

Os resultados são os seguintes:

14159 0.39700296920172 9.560746238889790E-002 9.992898637502570E-013
14159 0.39700296920172040 9.56074623888978209E-002 9.99311202935717304E-013
./regression_test.sh: line 11: reg1=: syntax error: operand expected (error token is "=")
./regression_test.sh: line 12: reg2=: syntax error: operand expected  (error token is "=")
./regression_test.sh: line 13: reg3=: syntax error: operand expected (error token is "=")
./regression_test.sh: line 14: reg4=: syntax error: operand expected  (error token is "=")
reg1

./regression_test.sh: line 25: ((: sqrt((reg2- exm2)^2)/reg2 < 1e-1: syntax error in expression (error token is "((reg2- exm2)^2)/reg2 < 1e-1")
./regression_test.sh: line 27: ((: sqrt((reg2- exm2)^2)/reg2 > 1e-1: syntax error in expression (error token is "((reg2- exm2)^2)/reg2 > 1e-1")
./regression_test.sh: line 29: ((: sqrt((reg3- exm3)^2)/reg3 < 1e-1: syntax error in expression (error token is "((reg3- exm3)^2)/reg3 < 1e-1")
./regression_test.sh: line 31: ((: sqrt((reg3- exm3)^2)/reg3 > 1e-1: syntax error in expression (error token is "((reg3- exm3)^2)/reg3 > 1e-1")
./regression_test.sh: line 33: ((: sqrt((reg4- exm4)^2)/reg4 < 1e-1: syntax error in expression (error token is "((reg4- exm4)^2)/reg4 < 1e-1")
./regression_test.sh: line 35: ((: sqrt((reg2- exm2)^2)/reg2 > 1e-1: syntax error in expression (error token is "((reg2- exm2)^2)/reg2 > 1e-1")

Como faço para alterar o script para me livrar dos erros de sintaxe e permitir que as variáveis usem os valores dos elementos para os arrays para os quais eu estou armazenando os dados lidos? qualquer ajuda seria apreciada, pois passei o último dia lendo sobre aritmética e scripts do bash e não consegui uma explicação clara da melhor maneira de fazer isso.

    
por EMP7705 08.09.2015 / 20:10

1 resposta

1

bash não tem matemática interna de ponto flutuante, nem acredito que forneça raízes quadradas. Para isso, você precisa chamar um utilitário externo, por exemplo, bc .

Talvez seja melhor escrever esse código em um idioma diferente, por exemplo, Perl ou Python; isso está se aproximando do limiar de complexidade que bash não lida tão bem, parece.

    
por 08.09.2015 / 20:14