测试人社区

Shell实战课后作业代码报错,提示语法错误,求解惑

lucky(){
    seq 1 100 | {

        all=()  #存储所有的所有的选手

        lucky_people=() #存储中奖的选手

        index=0 #初始化一个计数器

        while read line; do
            all+=($line)
        done

        echo ${all[@]}  #输出所有选手的信息
        echo "++++++所有参赛选手信息如上++++++"
        echo ""

        first_people=()
        first_people=("${all[@]}")  #备份所有选手的信息

        #筛选出一等奖得主
        while ((${#first_people[@]}>1)); do
            ((index+=1))

            first_sub=("${first_people[@]}")    #本轮参与淘汰的选手

            #淘汰不符合条件的选手
            for i in "${!first_people[@]}"; do
                ((RANDOM%6+1<3)) && unset first_people[$i]
            done

            echo "当前剩余选手为:${first_people[@]}"    #输出当前剩余选手信息

            #复活上一轮选手信息
            ((${#first_people[@]}==0)) && { first_people=("${first_sub[@]}"); }
        done

        #将一等奖得主存储在数组中
        lucky_people+=("${first_people[@]}")
        echo "一等奖得主为:${lucky_people[@]}"
        echo "++++++第一轮筛选结束,诞生一等奖选手++++++"
        echo ""
        echo ""     


        
        #筛选出二等奖得主

        second_people=()
        second_people=("${all[@]}") #备份所有选手的信息

        #过滤已获奖选手
        for s in "${!second_people[@]}"; do
            for l in "${!lucky_people[@]}"; do
                ((${second_people[$s]}==${lucky_people[$l]})) && unset second_people[$s]
            done
        done

        echo "第二轮参赛选手信息为:${second_people[@]}"
        echo ""

        while ((${#second_people[@]}>3)); do
            ((index+=1))

            second_sub=("${second_people[@]}" )  #本轮参与淘汰的选手
            
            #淘汰不符合条件的选手
            for i in "${!second_people[@]}"; do
                ((RANDOM%6+1<3)) && unset second_people[$i]
            done

            echo "当前剩余参赛选手为:${second_people[@]}"

            #复活上一轮参赛选手
            ((${#second_people[@]}<3)) && { second_people=("${second_sub[@]}"); }
        done 
        echo "二等奖得主为:${second_people[@]}"

        #将二等奖的得主存储在数组中
        lucky_people+=("${second_people[@]}")
        echo "一等奖、二等奖得主为:${lucky_people[@]}"
        echo "++++++第二轮筛选结束,诞生一等奖、二等奖得主++++++"
        echo ""
        echo ""


        # #筛选出三等奖得主
        third_people=()
        third_people=("${all[@]}")   #备份所有选手的信息
        
        for t in "${!third_people[@]}"; do
            for l in "${!lucky_people[@]}"; do
                ((${third_people[$t]}==${lucky_people[$l]})) && unset third_people[$t]
            done
        done

        echo "第三轮参赛选手信息为:${third_people[@]}"
        echo ""
        
    }
}

原因

  • 嵌套for循环中进行了unset 导致内层循环还在进行的时候,外层对应的值已经取不到了,所以判断中的一边为空 就有报错出现了

解决方案

  • 可以考虑加个break,在unset之后中断掉后续的内层循环,就不会有这个问题了
1 Like