我有一個 shell 腳本來運行多次 .c 程式(“switch”),它允許 3 個輸入參數。我想運行該程式 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
您確定的前兩行用於 執行命令並捕獲其輸出。應該是這樣。您使用 來 評估數學表達式是正確的。$((command))
$(command)
$((expression))
另外,平方根線應該是
dvt=$(echo "sqrt($dvt)" | bc -l)
而不是
dvt=$((echo `sqrt($dvt) | bc -l`))
甚至
dvt=$(echo `sqrt($dvt) | bc -l`)
該命令的問題margen=
可能是您將浮點數作為表達式的項之一傳遞給它。
答案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