Понадобилось мне создать энное количество каталогов вида "каталогХХХ", где ХХХ - последовательные номера в диапазоне от 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", я тупо взял его из
подобного примера. Но работает именно так, как надо.