Процесс будет записывать в набор каталогов, по одному на каждый час, используя запись date +% H, поэтому 00, 01, 02 ... 22, 23. Я хочу сохранить начальный 0 в однозначных часах, чтобы сохранить отсортированные списки аккуратные.
I = 00; до [$ I -gt 23]; сделать mkdir $ I; пусть I = I + 1; сделано
Имеет предсказуемые эффекты, заключающиеся в отсутствии ведущего 0 перед одиночными цифрами. Я мог бы просто пойти и сделать их вручную, но чувствую, что должен быть способ сделать это. Любые идеи?
mkdir {0{0..9},{10..23}}
Или в Bash 4:
mkdir {00..23}
mkdir $(seq -w 00 23)
for i in `seq -w 00 23`;do mkdir $i;done
Вот полностью переносимый ответ (для любой производной от Борна оболочки практически в любой системе, которая может запускать одну из них), тогда как все остальные ответы, по крайней мере, немного непереносимы, либо полагаются на непереносимые конструкции оболочки, либо seq
, что распространено, но ни в одном POSIX
ни универсальный:
# start with a blank/clean "dirs" variable
dirs=
# iterate over the first digit
for i in 0 1 2
do
# ..and the second digit for each first digit
for j in 0 1 2 3 4 5 6 7 8 9
do
# add each digit combination to the dirs list
dirs=$dirs\ $i$j
# ..until we reach 23 - then we're done.
case $i$j in 23) break 2; esac
done
done
# finally make the directories
mkdir $dirs
Некоторые примечания:
Первоначально создание каталогов гарантирует, что мы случайно не используем значение переменной среды с именем dirs
, если мы унаследуем его.
На самом деле мы могли бы пропустить создание $dirs
переменная и просто вызовите mkdir $i$j
. Но этот способ работает лучше (запускается один процесс mkdir вместо 24) и такой же переносимый (если по какой-то случайности действительно существует система mkdir
может принимать только один аргумент каталога *, это легко адаптировать для вызова mkdir
для каждого $i$j
комбинация вместо построения $dirs
переменная).
Отсутствие цитирования везде и намеренно, и правильно. Замены не нужно заключать в кавычки внутри присвоений переменных и в первой части case
заявление: они не подвергаются разделению поля в этих местах. И в mkdir
строчку в конце, мы полагаемся на разделение полей для разделения списка каталогов на отдельные имена / аргументы для mkdir
.
* «Официально» MS-DOS и Windows имеют mkdir
который принимает только одно имя каталога, но, по крайней мере, в Windows 7 он работает с несколькими именами каталогов, плюс любой порт Bourne-подобной оболочки для тех систем, о которых я знаю, поставляется с собственными mkdir
, и только такие чудаки, как я, могли бы даже подумать об этом уровне переносимости.