Официальная возможность получить лицензионный софт бесплатно.
Giveaway of the Day
Это не реклама!

Щелкните для получения прогноза по Биробиджану


четверг, 28 августа 2014 г.

Формирование списка чисел заданной ширины: seq

Понадобилось мне создать энное количество каталогов вида "каталогХХХ", где ХХХ - последовательные номера в диапазоне от 0 до 999, но не обязательно весь диапазон, например, от 6 до 155. При этом ХХХ - всегда три знака, стало быть

Конструкция for и "развёртывание фигурных скобок" (brace expansion - ABSG, ch.36, p.528)?

#start - начальный номер, finish - конечный
for i in {$start..$finish}; do ... ; done


Не пойдет! Потому что "развертывание" не поддерживает использование переменных, и $i примет текстовое значение "{начальный_номер..конечный_номер}" вместо ожидаемого набора чисел в нужном интервале.

Может вернуться ко временам DOS и сделать три вложенных цикла? Можно, и оно даже будет работать:

for i in {0..9}
  for j in {0..9}
    for k in {0..9}
      if [ $i$j$k -lt $start ] || [ $i$j$k -gt $finish ] then break
      mkdir каталог$i$j$k
...

Но зачем крутить лишние циклы и делать кучу лишних проверок на попадание в диапазон? В общем, команда seq рулит! Потребовалось некоторое время, чтобы вспомнить формат pfintf-a, но оно того стоило.

Сначала попробовал с ключом -w - выровнять ширину: если числа в последовательности имеют разную ширину, например "1" и "123", то меньшие будут дополняться ведущими нулями - для диапазона 1..111 "1" превратится в "001", "10" - в "010". Чудесно! Чудесно? Мне-то надо, чтобы было всегда три знака, независимо от конечного значения, а здесь три знака будут только если конечное значение трехзначное, увы. (с тоской вспоминаю Clarion, где такие вещи решались на "раз-два")

Что ж, раз ключ -w не подходит, попробуем поиграться с -f - формат вывода. А вот это - то, что доктор прописал:

for i in $( seq -f %03g 0 $max_dir_number )
do
    dir_name="каталог$i"
    mkdir $dir_name
    chown $owner_name:$owner_group $dir_name
    chmod 777 $dir_name
done


формат %03g как раз делает то, что я хочу: дополняет нулями слева (0), до трех знаков (3). Честно скажу, не помню, для чего суффикс "g", я тупо взял его из подобного примера. Но работает именно так, как надо.

Комментариев нет:

Отправить комментарий

Пожалуйста, воздержитесь от грубостей и персональных нападок.
Я не против матерщины, но она должна быть уместной и использоваться для выражения эмоций, а не в качестве основного средства выражения мыслей.