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

Linux 非常具体的错误。BASH脚本。模运算,linux,bash,terminal,modulus,operation,Linux,Bash,Terminal,Modulus,Operation,我正在编写一个简单的bash脚本来计算随机抽牌的次数。我将这些数据存储在一个数组中,当打印出结果时,每10次提取一张卡,我就以一种直方图形式打印一个“*”输出 不过,在终端上编译时,我一直收到此错误: task1.sh:第29行:%10:语法错误:应为操作数(错误标记为“%10”) task1.sh:第33行:%10:语法错误:应为操作数(错误标记为“%10”) 但我似乎不明白为什么。提前感谢您的帮助 #!/bin/bash randomdraw(){ Suits="Clubs Diamo

我正在编写一个简单的bash脚本来计算随机抽牌的次数。我将这些数据存储在一个数组中,当打印出结果时,每10次提取一张卡,我就以一种直方图形式打印一个“*”输出

不过,在终端上编译时,我一直收到此错误:


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
#/bin/bash
随机抽取(){
套装=“梅花钻石心黑桃”
西服=($西服)
面额=“2 3 4 5 6 7 8 9 10杰克女王国王王牌”
面额=($面额)
num#suites=${suites[*]}
num#U面额=${#面额[*]}
宣布-一项新的政策
宣布-诉讼发生

对于((x=0;$x您的
num_面额
数组大部分为空,并且

let "rounder=$(( ${numoccurences[x]} % 10 ))"
被评估为

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

请先打印
numoccurences
suitoccurences
,然后再请求循环编号进行调试。

您的
num\u面额
数组大部分为空,而

let "rounder=$(( ${numoccurences[x]} % 10 ))"
被评估为

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

请先打印
numoccurences
suitoccurences
,然后再请求循环号进行调试。

在bash中编写算术表达式的方式应尽量保持一致。不需要使用
$
在算术表达式中引入变量。也不需要使用
${array[idx]}
也可以。如果有算术运算,也没有理由使用
let
。因此

let "rounder=$(( ${numoccurences[x]} % 10 ))"
你可以写:

(( rounder = numoccurences[x] % 10 ))
在第一个例子中,如果
numoccurrences
没有与键
$x
对应的值,那么
${numoccurrences[x]}
将被零替换。在第二个例子中,
numoccurrence[x]
将被0替换,这是您真正想要的。(这与不必要的
let
无关,因为
$(…)
算术表达式是在运行
let
之前计算的。)

在剧本中还有许多其他地方,你最好简化你的风格。例如

let "starnum=$(( $(( ${numoccurences[x]} / 10 )) + 1 ))"
将更健壮,更具可读性

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

在bash中编写算术表达式的方式应该尽量保持一致。不需要使用
$
在算术表达式中引入变量。也不需要使用
${array[idx]}
。如果有算术求值,也没有理由使用
let
。因此

let "rounder=$(( ${numoccurences[x]} % 10 ))"
你可以写:

(( rounder = numoccurences[x] % 10 ))
在第一个例子中,如果
numoccurrences
没有与键
$x
对应的值,那么
${numoccurrences[x]}
将被零替换。在第二个例子中,
numoccurrence[x]
将被0替换,这是您真正想要的。(这与不必要的
let
无关,因为
$(…)
算术表达式是在运行
let
之前计算的。)

在剧本中还有许多其他地方,你最好简化你的风格。例如

let "starnum=$(( $(( ${numoccurences[x]} / 10 )) + 1 ))"
将更健壮,更具可读性

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

没关系…我解决了问题。谢谢你们help@wallofkron:如果您
声明-i starnum
,则不需要
;您只需编写
starnum=numacurences[x]/10+1
(但在这种情况下不能使用空格,因此
样式通常更具可读性).没关系…我解决了问题谢谢你们help@wallofkron:如果您
声明-i starnum
,则不需要
;您只需编写
starnum=numacurences[x]/10+1
(但在这种情况下不能使用空格,因此
样式通常更具可读性)。