Linux 非常具体的错误。BASH脚本。模运算
我正在编写一个简单的bash脚本来计算随机抽牌的次数。我将这些数据存储在一个数组中,当打印出结果时,每10次提取一张卡,我就以一种直方图形式打印一个“*”输出 不过,在终端上编译时,我一直收到此错误: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
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
(但在这种情况下不能使用空格,因此(
样式通常更具可读性)。