2016-12-01 33 views
1

该程序的主要目标是模拟卡片的绘制次数,随着用户选择,然后使用'*'打印直方图来表示每张卡片上的点击次数。但是,我遇到的问题是检索每个阵列中的元素并打印与它们相关的星星。这是我到目前为止有:Bash:遍历数组以获得每个索引的值

timelimit=5 
echo -e "How many trials would you like to run? \c" 
read -t $timelimit trials 

if [ ! -z "$trials" ] 
then 
    echo -e "\nWe will now run $trials trials" 
else 
    trials=10 
    echo -e "\nWe will now run the default amount of trials: $trials" 
fi 

count=1 
MAXCARD=53 
declare -a CARDARRAY 

while [ "$count" -le $trials ] 
do 
    card=$RANDOM 
    let "card %= MAXCARD" 
    let "CARDARRAY[$card] += 1" 
    let "count += 1" 
done 
echo ${CARDARRAY[@]} 

for ((i=0; i<${#CARDARRAY[@]}; i++)); 
do 
    #declare "temp"="${CARDARRAY[$i]}" 
    #echo "$temp" 
    #for ((j=0; j<temp; j++)); 
    #do 
    #echo "*" 
    #done 
    echo "$i" 
done 

显然最后的for循环是在那里我遇到问题,目前是按照每个卡多少命中有印刷的明星的最新尝试。

回答

2

你非常接近。以下是我想套用您的脚本:

#!/bin/bash 
timelimit=5 
printf %s 'How many trials would you like to run? ' 
read -t $timelimit trials 

if [[ ! -z $trials ]] ; then 
    printf '\nWe will now run %d trials\n' $trials 
else 
    trials=10 
    printf '\nWe will now run the default amount of trials: %d\n' $trials 
fi 

count=1 
MAXCARD=53 
declare -a CARDARRAY 

while ((trials--)) ; do 
    ((CARDARRAY[RANDOM % MAXCARD] += 1)) 
done 

printf '%s\n' "${CARDARRAY[*]}" 

for ((i=0 ; i<MAXCARD ; i++)) ; do 
    printf %02d: $i 

    for ((j=0 ; j<${CARDARRAY[i]:-0} ; j++)) ; do 
     printf %s '*' 
    done 
    printf '\n' '' 
done 

您可以使用set -xv看什么bash的每一步运行。

+0

有道理,来自C和Java这样的语言,bash的格式非常新!感谢您的帮助! – Hotshot

相关问题