Добавление переменной нуля в цифровую цифру
Попытка добавить нуль перед varaible, если она меньше 10 и создать указанную директорию. Кажется, я не могу правильно добавить нуль. Продолжает создавать 02.1.2011
, 02.2.2011
и т.д. И т.д.
i=0
for i in {01..31}
do
if $i > 10
then
mkdir $path/02.0$i.2011
else
mkdir $path/02.$i.2011
fi
done
Ответы
Ответ 1
Вы можете заменить всю партию:
for i in 0{1..9} {10..31} ; do
mkdir $path/02.$i.2011
done
пока не нужно запускать какие-либо внешние процессы (кроме того, что может быть в теле цикла).
Вероятно, это не так важно здесь, поскольку mkdir
не является одной из тех вещей, которые вы, как правило, делаете много в жесткой петле, но будет важно, если вы напишете много своего быстрого и грязного кода в bash
.
Создание процесса дорого, когда вы делаете это сотни тысяч раз, когда некоторые из моих скриптов иногда делали: -)
Пример, чтобы вы могли увидеть его в действии:
pax$ for i in 0{7..9} {10..12}; do echo $i; done
07
08
09
10
11
12
И если у вас есть версия с достаточно большим числом bash
, она выполнит ваш запрос для ведущих цифр:
Выражение последовательности принимает вид {x..y[..incr]}
, где x
и y
являются либо целыми числами, либо одиночными символами, а incr
, необязательным приращением, является целым числом. Когда вводятся целые числа, выражение расширяется до каждого числа между x
и y
, включительно. Поставляемые целые числа могут иметь префикс 0
, чтобы заставить каждый термин иметь одинаковую ширину. Когда либо x
, либо y
начинается с нуля, оболочка пытается заставить все сгенерированные термины содержать одинаковое количество цифр, при необходимости нулевое заполнение.
Итак, в моем ящике Debian 6 с bash
версии 4.1.5:
pax$ for i in {07..11} ; do echo $i ; done
07
08
09
10
11
Ответ 2
Вы можете использовать
$(printf %02d $i)
Чтобы сгенерировать числа в нужном формате.
for i in $(seq 0 1 31)
do
mkdir $path/02.$(printf %02d $i).2011
done
Ответ 3
лучше:
for i in $(seq -f %02g 1 31)
do
mkdir "$path/02.$i.2011"
done
Или даже:
for i in {01..31}
do
mkdir "$path/02.$(printf "%02d" $i).2011"
done
Ответ 4
В Bash 4, расширение диапазона расширений даст вам начальные нули, если вы попросите их:
for i in {01..31}
не делая ничего другого.
Если вы используете более ранние версии Bash (или 4, если на то пошло), нет необходимости использовать внешнюю утилиту, такую как seq
:
for i in {1..31}
или
for ((i=1; i<=31; i++))
с любым из них:
mkdir "$path/02.$(printf '%02d' "$i").2011"
Вы также можете сделать:
z='0'
mkdir "$path/02.${z: -${#i}}$i.2011"
Используя предложение paxdiablo, вы можете сразу сделать все каталоги без цикла:
mkdir "$path"/02.{0{1..9},{10..31}}.2011
Ответ 5
Будет ли это работать для вас?
zeroes="0000000"
pad=$zeroes$i
echo ${pad:(-2)}
Ответ 6
$ seq --version | head -1
seq (GNU coreutils) 8.21
$ seq -f "%02g" 1 10
01
02
03
04
05
06
07
08
09
10
Ответ 7
Оператор if/then обратный. Вы добавляете 0, когда он выше 10, не добавляя его, когда он ниже.
Другая ошибка заключается в том, что вы делаете отсечку строго больше 10, которая не включает 10, хотя 10 - две цифры.
Ответ 8
path=/tmp
ruby -rfileutils -e '1.upto(31){|x| FileUtils.mkdir "'$path'/02.%02d.2011" % x}'
Ответ 9
Вот что я сделал для script, где я прошу день, диапазон дней, регулярное выражение и т.д. с по умолчанию улучшенными регулярными выражениями, разделяемыми paxdiablo.
for day in $days
do if [ 1 -eq "${#day}"] ; then
day="0$day"
fi
Я просто просматриваю это в начале моего цикла, где я запускаю анализ журнала в этот день, зарытый в каталоги с ведущими нулями.
Ответ 10
Я создал эту простую утилиту для этого, удачи, надеюсь, что это поможет stack'ers!
for i in {1..24}
do
charcount=`echo $i|wc -m`
count=`expr $charcount - 1`
if [ $count -lt 2 ];
then
i="0`echo $i`"
fi
echo "$i"
done