Ich habe ein Shell-Skript, um ein .c-Programm („switch“) mehrmals auszuführen, das 3 Eingabeparameter zulässt. Ich möchte das Programm 4 Mal ausführen, Werte übergeben {4,16,32,64}
und für die Parameter
{0.1,0.2,.3,.4,.5,.55,.575,.6,.625,.65,.7,.75,.8,.9}
eine Tabelle mit Durchschnitts- und Konfidenzintervallen erstellen. Das Skript sieht wie folgt aus:
#!/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
Trotzdem bekomme ich einen Fehler in Zeile 27
a$k=$((`./switch -N$i -r$j -n$num`))
und Linien
dvt=$((echo `sqrt($dvt) | bc -l`))
margen=$((dvt*$stud/2))
Was mache ich falsch?
Antwort1
Die ersten beiden Zeilen, die Sie identifiziert haben, werden verwendet, um einen Befehl auszuführen und seine Ausgabe zu erfassen. Das sollte lauten . Ihre Verwendung von zur Auswertung eines mathematischen Ausdrucks ist korrekt.$((command))
$(command)
$((expression))
Außerdem sollte die Quadratwurzellinie
dvt=$(echo "sqrt($dvt)" | bc -l)
statt
dvt=$((echo `sqrt($dvt) | bc -l`))
oder auch
dvt=$(echo `sqrt($dvt) | bc -l`)
Das Problem mit dem margen=
Befehl besteht möglicherweise darin, dass Sie ihm als einen der Terme des Ausdrucks einen Float übergeben.
Antwort2
Ich würde die Einstellung a$k
in ein assoziatives Array wie folgt umstrukturieren:
declare -a a
for k in {1..4}
do
a[$k]=$((`./switch -N$i -r$j -n$num`))
sum=$((sum + a[$k]))
done
Dadurch wäre das Array, a
nachdem es mit Werten aus der obigen for
Schleife gefüllt wurde, für andere Schleifen weiter unten in Ihrem Code zugänglich.
Diese Zeile weiter unten in der letzten for
Schleife muss ebenfalls wie folgt angepasst werden:
dvt=$((dvt + (a[$k] - $avg)*(a[$k] - $avg)))
Floats mit $((..))
Ich glaube nicht, dass Sie mit dieser $((...))
Notation Gleitkommazahlen hinzufügen können. Zumindest hat es nicht funktioniert, als ich es probiert habe:
$ echo $((0.10 + .20))
bash: 0.10 + .20: syntax error: invalid arithmetic operator (error token is ".10 + .20")
Um diese Operationen mit Gleitkommazahlen als Token durchzuführen, müssen Sie bc
einen Rechner verwenden, der diese Operationen durchführen kann.
$ echo "0.10 + .20" | bc
.30