我正在编写一个简单的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
答案 0 :(得分:1)
您的num_denominations
数组大部分都是空的
let "rounder=$(( ${numoccurences[x]} % 10 ))"
评估为
let "rounder=$(( % 10 ))"
在询问用于调试的循环编号之前打印numoccurences
和suitoccurences
。
答案 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 ))