Добавление нуля в однозначную переменную - PullRequest
21 голосов
/ 24 февраля 2011

Попытка добавить ноль перед переменной, если она меньше 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

Ответы [ 10 ]

51 голосов
/ 24 февраля 2011

Вы можете заменить весь лот:

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 box с bash версия 4.1.5:

pax$ for i in {07..11} ; do echo $i ; done
07
08
09
10
11
20 голосов
/ 24 февраля 2011

Вы можете использовать

$(printf %02d $i)

Для генерации чисел в нужном формате.

for i in $(seq 0 1 31)
do
    mkdir $path/02.$(printf %02d $i).2011
done
12 голосов
/ 24 февраля 2011

Лучше:

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 голосов
/ 24 февраля 2011

В 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
3 голосов
/ 24 февраля 2011

Будет ли это работать для вас?

zeroes="0000000"
pad=$zeroes$i
echo ${pad:(-2)}
2 голосов
/ 05 февраля 2014
$ seq --version | head -1
seq (GNU coreutils) 8.21
$ seq -f "%02g" 1 10
01
02
03
04
05
06
07
08
09
10
0 голосов
/ 25 февраля 2017

Я создал эту простую утилиту для выполнения этого, Удачи, надеюсь, это поможет стекам !!

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
0 голосов
/ 30 августа 2012

Вот что я сделал для сценария, в котором я запрашиваю день, диапазон дней, регулярное выражение и т. Д. Со стандартными улучшенными регулярными выражениями, используемыми paxdiablo.

for day in $days
    do if [ 1 -eq "${#day}"] ; then
        day="0$day"
    fi

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

0 голосов
/ 24 февраля 2011
path=/tmp
ruby -rfileutils -e '1.upto(31){|x| FileUtils.mkdir "'$path'/02.%02d.2011" % x}'
0 голосов
/ 24 февраля 2011

Ваше утверждение if / then обратное.Вы добавляете 0, когда он выше 10, а не добавляете один, когда он ниже.

Другая ошибка состоит в том, что вы делаете отсечение строго больше 10, что не включает 10, даже если 10 равно двумцифры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...