코드 결과를 이미 설정한 회귀 테스트 결과와 비교하는 스크립트를 작성하려고 합니다.

코드 결과를 이미 설정한 회귀 테스트 결과와 비교하는 스크립트를 작성하려고 합니다.

나는 내 코드를 실행한 다음 최종 출력을 regression.dat에서 이전 실행(올바른 결과 포함)과 비교하는 bash 스크립트를 작성하려고 했습니다. 그 목표는 코드가 이전과 동일한 반복 횟수로 수렴되는지 여부와 결과가 .dat 파일의 기준 결과의 0.1% 내에 있는지 여부를 알려주는 것입니다. 지금까지 구문 오류가 많이 발생했으며 이를 제거하더라도 reg1, reg2, reg3 등의 변수는 값으로 0만 저장합니다.

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

결과는 다음과 같습니다.

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")

구문 오류를 제거하고 변수가 읽은 데이터를 저장할 배열의 요소 값을 가져오도록 스크립트를 어떻게 변경할 수 있습니까? 지난 하루 동안 bash 산술 및 스크립팅에 대해 읽었지만 이를 수행하는 가장 좋은 방법에 대한 명확한 설명을 얻을 수 없었기 때문에 어떤 도움이라도 대단히 감사하겠습니다.

답변1

bash내장된 부동 소수점 수학이 없으며 그것이 제곱근을 제공한다고 생각하지도 않습니다. 이를 위해서는 외부 유틸리티(예: )를 호출해야 합니다 bc.

Perl이나 Python과 같은 다른 언어로 이 코드를 작성하는 것이 더 나을 수도 있습니다. 이는 bash가 잘 처리할 수 없는 복잡성 임계값에 접근하는 것 같습니다.

관련 정보