需要改进 Bash 中的数字计数器

问题描述 投票:0回答:1

我用关联数组制作了一个简单的数字计数器。 有没有更好的方法来声明和初始化这些数组,特别是“段”数组来制作我使用键和值组合的二维数组。或者这是在 Bash 中执行此操作的唯一方法?

如果代码不是太糟糕的话,我也想听到代码方面的反馈。这是一个简单的计数器。

#!/bin/bash
#set -x
declare -r MAX_DIGITS=10
declare -i position=0

declare -A digits

declare -A segments
segments["0,0"]=1
segments["0,1"]=1
segments["0,2"]=1
segments["0,3"]=1
segments["0,4"]=1
segments["0,5"]=1
segments["0,6"]=0
segments["1,0"]=0
segments["1,1"]=1
segments["1,2"]=1
segments["1,3"]=0
segments["1,4"]=0
segments["1,5"]=0
segments["1,6"]=0
segments["2,0"]=1
segments["2,1"]=1
segments["2,2"]=0
segments["2,3"]=1
segments["2,4"]=1
segments["2,5"]=0
segments["2,6"]=1
segments["3,0"]=1
segments["3,1"]=1
segments["3,2"]=1
segments["3,3"]=1
segments["3,4"]=0
segments["3,5"]=0
segments["3,6"]=1
segments["4,0"]=0
segments["4,1"]=1
segments["4,2"]=1
segments["4,3"]=0
segments["4,4"]=0
segments["4,5"]=1
segments["4,6"]=1
segments["5,0"]=1
segments["5,1"]=0
segments["5,2"]=1
segments["5,3"]=1
segments["5,4"]=0
segments["5,5"]=1
segments["5,6"]=1
segments["6,0"]=1
segments["6,1"]=0
segments["6,2"]=1
segments["6,3"]=1
segments["6,4"]=1
segments["6,5"]=1
segments["6,6"]=1
segments["7,0"]=1
segments["7,1"]=1
segments["7,2"]=1
segments["7,3"]=0
segments["7,4"]=0
segments["7,5"]=0
segments["7,6"]=0
segments["8,0"]=1
segments["8,1"]=1
segments["8,2"]=1
segments["8,3"]=1
segments["8,4"]=1
segments["8,5"]=1
segments["8,6"]=1
segments["9,0"]=1
segments["9,1"]=1
segments["9,2"]=1
segments["9,3"]=1
segments["9,4"]=0
segments["9,5"]=1
segments["9,6"]=1

declare -A segment_grid
segment_grid["0,0"]=0
segment_grid["0,1"]=1
segment_grid["1,0"]=1
segment_grid["1,1"]=2
segment_grid["2,0"]=2
segment_grid["2,1"]=2
segment_grid["3,0"]=2
segment_grid["3,1"]=1
segment_grid["4,0"]=2
segment_grid["4,1"]=0
segment_grid["5,0"]=1
segment_grid["5,1"]=0
segment_grid["6,0"]=1
segment_grid["6,1"]=1

clear_digits_array() {
   local -i i=0
   local -i j=0

   while [ "$i" -lt 4 ]; do
   j=0
       while [ "$j" -lt "$((MAX_DIGITS * 4))" ]; do
           digits[$i,$j]=' '
       ((j++))
       done
   ((i++))
   done
}

process_digit() {
    local -i i=0
    local -i row
    local -i col

    while [ "$i" -lt 7 ]; do
        if [ "${segments[$1,$i]}" == 1 ]; then
            row="${segment_grid[$i,0]}"
            col="${segment_grid[$i,1]}"
            col="$((col + $2))"
            if [ "$((i % 3))" -eq 0 ]; then
                digits[$row,$col]='_'
            else
                digits[$row,$col]='|'
            fi
        fi
    ((i++))
    done
}

print_digits_array() {
     local -i i=0
     local -i j=0

     while [ "$i" -lt 3 ]; do
     j=0
         while [ "$j" -lt "$((MAX_DIGITS * 4))" ]; do
             echo -n "${digits[$i,$j]}"
         ((j++))
         done
     echo
     ((i++))
     done
}


for number in {0..9}; do
    clear
    clear_digits_array

       process_digit "$number" "$position"
#       ((position+=4))

    print_digits_array
    sleep 0.5
done

exit 0
arrays bash counter associative
1个回答
0
投票

初始化索引数组比关联数组更容易。为了简化一点,你可以尝试这样的事情:

declare -a arr
declare -A segment
arr=( 1 1 1 1 1 1 0 0 1 1 0 0 0 0 1 1 0 1 1 0 1 1 1 1 1 0 0 1 0 1 1 0 0 1 1 1 0 1 1 0 1 1 1 0 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 1 1 )
for (( i=0; i<=9; i++ )); do
    for (( j=0; j<=6; j++ )); do
        (( k=i*7+j ))
        segment["$i,$j"]="${arr[k]}"
    done
done
© www.soinside.com 2019 - 2024. All rights reserved.