非常具体的错误。 BASH脚本。模数运算

时间:2016-05-10 04:29:49

标签: linux bash terminal modulus operation

我正在编写一个简单的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

2 个答案:

答案 0 :(得分:1)

您的num_denominations数组大部分都是空的

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

评估为

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

在询问用于调试的循环编号之前打印numoccurencessuitoccurences

答案 1 :(得分: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 ))