2016-05-10 21 views
0

Ich schreibe ein einfaches Bash-Skript, um die Anzahl der zufälligen Ziehungen von Karten zu zählen. Ich speichere diese in einem Array, und wenn ich die Ergebnisse ausgedruckt habe, drucke ich für jede 10 Mal, die diese Karte gezogen wird, ein einzelnes "*" in einer Art Histogramm-Ausgabeart.Sehr spezifische Fehler. BASH-Skript. Modulus-Operation

Obwohl ich halten diese Fehler zu erhalten, wenn auf Terminal Kompilieren:


"task1.sh: Leitung 29: 10%: syntax error: Operanden erwartet (Fehler-Token ist" % 10 „)

task1.sh: Linie 33:% 10: Syntaxfehler: Operand erwartet (Fehler-Token ist "% 10")“


scheinen kann nicht, warum, obwohl herauszufinden. Vielen Dank im Voraus für jede Hilfe.

#!/bin/bash 
randomdraw(){ 
Suits="Clubs Diamonds Hearts Spades" 
suit=($Suits) 

Denominations="2 3 4 5 6 7 8 9 10 Jack Queen King Ace" 
denomination=($Denominations) 

num_suits=${#suit[*]} 
num_denominations=${#denomination[*]} 

declare -a numoccurences 

declare -a suitoccurences 

for ((x=0 ; $x<$loopnum ; x=$x+1)); 
    do 
((numoccurences[$((RANDOM%num_denominations))]++)) 
((suitoccurences[$((RANDOM%num_suits))]++)) 
    done 
} 

echo "How Many Random Draws?: " 
read loopnum 
randomdraw loopnum 

for ((x=0 ; $x<$num_denominations ; x=$x+1)); 
    do 
     let "rounder=$((${numoccurences[x]} % 10))" 


     if [ $rounder -ge 5 ]; 
      then 
       let "starnum=$(($((${numoccurences[x]}/10)) + 1))" 
      else 
       let "starnum=$((${numoccurences[x]}/10))" 
     fi 
     echo "${denomination[x]}: " 
     for ((k=0 ; $k<$starnum ; k=$k+1)); 
     do 
      echo "*" 
     done 

    done 

Antwort

1

Ihr num_denominations Array ist meist leer und die

let "rounder=$((${numoccurences[x]} % 10))" 

wird ausgewertet

let "rounder=$((% 10))" 

Drucken numoccurences und suitoccurences vor für das Debuggen für Loop-Nummer fragen.

1

Sie sollten versuchen, konsistent zu sein, wie Sie arithmetische Ausdrücke in bash schreiben. Sie müssen $ nicht verwenden, um eine Variable in einen arithmetischen Ausdruck einzufügen. Und Sie müssen auch nicht ${array[idx]} verwenden. Es gibt keinen Grund, let zu verwenden, wenn Sie eine arithmetische Auswertung haben. Anstatt also

let "rounder=$((${numoccurences[x]} % 10))" 

könnten Sie schreiben:

((rounder = numoccurences[x] % 10)) 

Diese nicht ganz das gleiche tun. In der ersten wird ${numoccurences[x]} durch nichts ersetzt, wenn numoccurrences keinen Wert hat, der dem Schlüssel $x entspricht. In der zweiten wird numoccurrence[x] durch 0 ersetzt, was Sie eigentlich wollen. (Das hat nichts mit dem unnötigen let zu tun, da die $((...)) arithmetischen Ausdruck ausgewertet wird, bevor let ausgeführt wird.)

Es gibt viele andere Orte in diesem Skript, in dem Sie sich auch Ihre Art zu vereinfachen beraten. Zum Beispiel

let "starnum=$(($((${numoccurences[x]}/10)) + 1))" 

wäre robuster und besser lesbar als

((starnum = numoccurences[x]/10 + 1)) 
+0

Vielen Dank für diese Hilfe .... – WallofKron

+0

In meinem Code, sollte ich erklären starnum bis oben? – WallofKron

+0

vergiss ... Ich löste das Problem. Danke Jungs für die Hilfe – WallofKron