我用关联数组制作了一个简单的数字计数器。 有没有更好的方法来声明和初始化这些数组,特别是“段”数组来制作我使用键和值组合的二维数组。或者这是在 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
初始化索引数组比关联数组更容易。为了简化一点,你可以尝试这样的事情:
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