Ausgabe des AC-Programms einer Shell-Variable zuweisen: Token-Fehler

Ausgabe des AC-Programms einer Shell-Variable zuweisen: Token-Fehler

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$kin 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, anachdem es mit Werten aus der obigen forSchleife gefüllt wurde, für andere Schleifen weiter unten in Ihrem Code zugänglich.

Diese Zeile weiter unten in der letzten forSchleife 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 bceinen Rechner verwenden, der diese Operationen durchführen kann.

$ echo "0.10 + .20" | bc
.30

verwandte Informationen