Как использовать «сеточные массивы» в Bash? - PullRequest
0 голосов
/ 04 декабря 2011

У меня есть куча файлов с цифрами в именах.Каждый номер файла принадлежит «группе» или диапазону номеров.Я хотел бы сопоставить номер файла в группе, в которой он находится, а затем экспортировать его как переменную.Я не уверен, как это сделать, но я предполагаю, что это будет что-то похожее на:

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, поэтому я бы действительно предпочел, чтобы вы дали мне только некоторые способы в bash.Кроме того, я знаю, что второй столбец кажется ненужным, когда вы можете просто сделать while [ $num -ge "COLUMN3" ], но мне нужен первый столбец позже в скрипте.

Ответы [ 2 ]

2 голосов
/ 04 декабря 2011

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
0 голосов
/ 05 декабря 2011

Это может сработать и для вас:

$ 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...