私は私のコードを実行し、最終出力を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")
構文エラーを取り除き、変数が読み取ったデータを格納する配列の要素値を取得するようにスクリプトを変更するにはどうすればよいですか?過去1日の間にbash算術とスクリプティングについて読みましたが、これを行う最良の方法の明確な説明を得ることができなかったので、どんな助けにも感謝します。
ベストアンサー1
bash
組み込みの浮動小数点数学はなく、それが平方根を提供するとは思わない。これを行うには、外部ユーティリティ(たとえば)を呼び出す必要がありますbc
。
PerlやPythonなどの他の言語でこのコードを書く方が良いかもしれません。これはbashがうまく処理できない複雑さのしきい値に近づいているようです。