如何在bash中使用“网格数组”?

时间:2011-12-04 17:16:07

标签: arrays bash multidimensional-array

我有一堆名字中带有数字的文件。每个文件编号属于“组”或数字范围。我想匹配它所在的组中的文件号,然后将其作为变量导出。我不知道该怎么做,但我认为它会类似于:

Array:
(A, 1, 20)
(B, 21, 34)
(C, 35, 52)
(D, 53, 68)

如果第一列是组名,则第二列是范围中的第一个数字,最后一列是范围中的最后一个数字。然后,我可以应用类似的东西:

if [ $num -ge "COLUMN2" ] && [ $num -le "COLUMN3" ]; then
    groupname=COLUMN1
fi

我是编码的新手,刚开始学习bash shell,所以如果你只是在bash中给我这样的话,我真的更喜欢。另外,我知道当你可以while [ $num -ge "COLUMN3" ]时,第二列似乎是不必要的,但我需要在脚本的后面第一列。

2 个答案:

答案 0 :(得分:2)

bash并不真正做多维数组,但为此目的,一系列单维数组应该可以正常运行:

group_names=("A" "B" "C" "D")
group_min=(1 21 35 53)
group_max=(20 34 52 68)

groupname=
for (( i=0; i < ${#group_names[@]}; i++ )); do
    if [ $num -ge ${group_min[i]} ] && [ $num -le ${group_max[i]} ]; then
        groupname="${group_names[i]}"
        break
    fi
done
if [ -z "$groupname" ]; then
    echo "Oops, no matching group found!"
fi

答案 1 :(得分:0)

这也可能对您有用:

$ number=51 group=
$ array=("A 1 20" "B 21 34" "C 35 52" "D 53 68")
$ for element in "${array[@]}"
> do read key min max <<<"$element"
> (( number >= min && number <= max )) && group=$key && break
> done
$ [[ $group ]] && echo "number=$number group=$group" || echo "number=$number no match"
$ number=51 group=C