2016-05-10 6 views
0

Я пишу простой скрипт bash для подсчета количества случайных обратных карт. Я храню их в массиве, и при распечатке результатов за каждые 10 раз, когда карта вытягивается, я печатаю один единственный «*» в виде стиля гистограммы вывода.Очень специфические ошибки. Сценарий BASH. Работа модуля

Хотя, я продолжаю получать эту ошибку при компиляции на терминале:


"task1.sh: строка 29:% 10: ошибка синтаксиса: операнд ожидаемой (маркер ошибки" % 10 «)

task1.sh: строка 33:% 10: ошибка синтаксиса: операнд ожидаемой (маркер ошибки "% 10")»


не могу понять, почему же. Спасибо заранее за любую помощь.

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

ответ

1

Ваш num_denominations массив в основном пуст и

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

оценивается в

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

печати numoccurences и suitoccurences, прежде чем просить номер цикла для отладки.

1

Вы должны стараться быть последовательными в том, как вы пишете арифметические выражения в bash. Вам не нужно использовать $, чтобы ввести переменную внутри арифметического выражения. И вам не нужно использовать ${array[idx]}. Нет причин использовать let, если у вас есть арифметическая оценка. Таким образом, вместо

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

Вы могли бы написать:

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

Это не совсем то же самое. В первом случае ${numoccurences[x]} ничего не заменит, если numoccurrences не имеет значения, соответствующего ключу $x. Во втором, numoccurrence[x] будет заменен на 0, что и есть то, что вы на самом деле хотите. (Это не имеет ничего общего с ненужной let, так как $((...)) арифметического выражения вычисляется перед let запускается.)

Есть много других мест, в том сценарии, где можно было бы посоветовать, чтобы упростить свой стиль. Например,

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

будет более надежным и более удобным для чтения, как

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

спасибо за это помощь .... – WallofKron

+0

В моем коде, я должен объявить starnum до вершины? – WallofKron

+0

nevermind ... Я решил проблему. Спасибо, ребята, за помощь – WallofKron