
3つの入力パラメータを許可する.cプログラム(「スイッチ」)を複数回実行するシェルスクリプトがあります。プログラムを4回実行し、値{4,16,32,64}
とパラメータを渡し{0.1,0.2,.3,.4,.5,.55,.575,.6,.625,.65,.7,.75,.8,.9}
、平均と信頼区間テーブルを作成したいと思います。スクリプトは次のとおりです。
#!/bin/bash
if [ -e salida.txt ]; then
# echo "File exists"
rm salida.txt
fi
touch salida.txt
touch sal1.txt
touch sal2.txt
touch sal3.txt
touch sal4.txt
touch salida.txt
num=1000000
stud=3.182
for j in {0.1,0.2,.3,.4,.5,.55,.575,.6,.625,.65,.7,.75,.8,.9}
do
rm sal1.txt sal2.txt sal3.txt sal4.txt
for i in {4,16,32,64}
do
margen=0
sum=0
avg=0
for k in {1..4}
do
a$k=$((`./switch -N$i -r$j -n$num`))
sum=$((sum + a$k))
done
avg=$((sum/4))
dvt=0
for k in {1..4}
do
dvt=$((dvt + (a$k - $avg)*(a$k - $avg)))
done
dvt=$((dvt /3))
dvt=$((echo `sqrt($dvt) | bc -l`))
margen=$((dvt*$stud/2))
echo $avg $margen >> sal$i.txt
done
join sal1.txt sal2.txt sal3.txt sal4.txt >> salida.txt
done
それでも27行目でエラーが発生します。
a$k=$((`./switch -N$i -r$j -n$num`))
そしてライン
dvt=$((echo `sqrt($dvt) | bc -l`))
margen=$((dvt*$stud/2))
私は何が間違っていましたか?
答え1
識別された最初の2行は、コマンドを実行してその出力をキャプチャするためのものです。そうする必要があります。数学的表現を評価するのに適しています。$((command))
$(command)
$((expression))
また、平方根は次のようになります。
dvt=$(echo "sqrt($dvt)" | bc -l)
代わりに
dvt=$((echo `sqrt($dvt) | bc -l`))
でも
dvt=$(echo `sqrt($dvt) | bc -l`)
このコマンドの問題は、margen=
式の用語の1つに浮動小数点を渡すことです。
答え2
a$k
次のように設定を連想配列にリファクタリングします。
declare -a a
for k in {1..4}
do
a[$k]=$((`./switch -N$i -r$j -n$num`))
sum=$((sum + a[$k]))
done
a
これにより、上記のfor
ループの値でコードの他のループの値を入力して配列にアクセスできます。
最後のループfor
のこの行も次のように調整する必要があります。
dvt=$((dvt + (a[$k] - $avg)*(a[$k] - $avg)))
$((..)) で浮動
私はあなたがシンボルを使って浮動小数点を追加できるとは信じていません$((...))
。少なくとも試してみるとうまくいきません。
$ echo $((0.10 + .20))
bash: 0.10 + .20: syntax error: invalid arithmetic operator (error token is ".10 + .20")
bc
浮動小数点数をマーカーとして使用してこれらの操作を実行するには、これらの操作を実行できる計算機にアクセスできる必要があります。
$ echo "0.10 + .20" | bc
.30