Подтвердить что ты не робот

Добавление переменной нуля в цифровую цифру

Попытка добавить нуль перед 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
4b9b3361

Ответ 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