【问题标题】:Bash: Iterating through an array to get the value at each indexBash:遍历数组以获取每个索引处的值
【发布时间】:2016-12-01 20:14:07
【问题描述】:

该程序的主要目标是模拟用户选择多次绘制卡片,然后使用“*”打印出直方图,以表示每张卡片上的命中次数。但是,我遇到的问题是检索每个数组中的元素并打印与它们相关的星星。这是我目前所拥有的:

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 循环是我遇到问题的地方,目前是根据每张卡片的命中次数打印星星的最新尝试。

【问题讨论】:

    标签: arrays bash shell loops iteration


    【解决方案1】:

    你已经很接近了。以下是我将如何解释您的脚本:

    #!/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。

    【讨论】:

    • 有道理,来自 C 和 Java 之类的语言,bash 的格式非常新!感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    • 2014-02-03
    • 2020-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多