2016-05-10 1 views
0

J'écris un script bash simple pour compter le nombre d'occurrences de tirages aléatoires de cartes. Je les stocke dans un tableau, et lors de l'impression des résultats, pour chaque 10 fois que cette carte est tirée, j'imprime un seul '*' dans une sorte de style d'histogramme de sortie.Erreurs très spécifiques. Script BASH. Fonctionnement du module

Bien que, je continue à recevoir cette erreur lors de la compilation sur Terminal:


"task1.sh: ligne 29:% 10: erreur de syntaxe: opérande attendue (jeton d'erreur est" % 10 «)

task1.sh: ligne 33: 10%: erreur de syntaxe: opérande attendue (jeton d'erreur est "% 10") »


peut sembler ne pas comprendre pourquoi si. Merci d'avance pour toute aide.

#!/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 

Répondre

1

Votre tableau num_denominations est presque vide et le

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

est évalué à

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

Imprimer numoccurences et suitoccurences avant de demander le numéro de boucle pour le débogage.

1

Vous devriez essayer d'être cohérent dans la façon dont vous écrivez des expressions arithmétiques dans bash. Vous n'avez pas besoin d'utiliser $ pour introduire une variable dans une expression arithmétique. Et vous n'avez pas besoin d'utiliser ${array[idx]} non plus. Il n'y a aucune raison d'utiliser let si vous avez une évaluation arithmétique, soit. Ainsi, au lieu de

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

Vous pouvez écrire:

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

Ce ne sont pas tout à fait la même chose. Dans le premier, ${numoccurences[x]} sera remplacé par rien si numoccurrences n'a pas une valeur correspondant à la clé $x. Dans le second, numoccurrence[x] sera remplacé par 0, ce qui est ce que vous voulez réellement. (Cela n'a rien à voir avec le let inutile, puisque l'expression arithmétique $((...)) est évaluée avant let est exécuté.)

Il y a beaucoup d'autres endroits dans ce script où vous seriez bien avisé de simplifier votre style. Par exemple,

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

serait plus robuste et plus lisible que

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

merci pour cette aide .... – WallofKron

+0

Dans mon code, dois-je déclarer starnum-haut? – WallofKron

+0

nevermind ... J'ai résolu le problème. Merci les gars pour l'aide – WallofKron