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

Как добавить начальные нули для for-loop в оболочке?

У меня есть базовое число для цикла, которое увеличивает каждую переменную num на 1 на каждую итерацию...

for (( num=1; num<=5; num++ ))
do
 echo $num
done

Какие выходы:

1
2
3
4
5

Я пытаюсь заставить его выдавать результат (добавить начальный ноль до $num):

01
02
03
04
05

Без выполнения:

echo 0$num
4b9b3361

Ответ 1

Используйте следующий синтаксис:

$ for i in {01..05}; do echo "$i"; done
01
02
03
04
05

Если вы хотите использовать printf, ничто не мешает вам поместить его результат в переменную для дальнейшего использования:

$ foo=$(printf "%02d" 5)
$ echo "${foo}"
05

Отказ от ответственности: это работает только в >=bash-4.

Ответ 2

seq -w будет определять ширину и нормализовать ее.

for num in $(seq -w 01 05); do
    ...
done

По-видимому, это не работает в новейших версиях iOS, поэтому вы можете установить macports и использовать его версию seq, или вы можете явно задать формат:

seq -f '%02g' 1 3
    01
    02
    03

Но учитывая уродство спецификаций формата для такой простой проблемы, я предпочитаю решение Henk и Adrian, которое просто использует Bash. Apple не может это испортить, так как нет общей версии unix версии Bash:

echo {01..05}

Или:

for number in {01..05}; do ...; done

Ответ 3

Используйте команду printf для добавления 0:

printf "%02d\n" $num

Ваш цикл будет выглядеть следующим образом:

for (( num=1; num<=5; num++ )); do printf "%02d\n" $num; done
01
02
03
04
05

Ответ 4

Мне не интересно выводить его на экран (что в основном используется printf, верно?) Переменная $num будет использоваться как параметр для другой программы, но позвольте мне посмотреть, что я могу сделать с помощью это.

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

for num in {1..5}
do
   value=$(printf "%02d" $num)
   ... Use $value for your purposes
done

Ответ 5

почему бы не printf '%02d' $num? См. help printf для этой внутренней команды bash.

Ответ 6

Начиная с bash 4.0, вы можете использовать расширение Brace с фиксированными строками длины. См. Ниже оригинальное объявление.

Он будет делать то, что вам нужно, и не требует ничего внешнего для оболочки.

$ echo {01..05}
01 02 03 04 05

for num in {01..05}
do
  echo $num
done
01
02
03
04
05

Из файла bash/NEWS

Это краткое описание новых функций, добавленных в bash -4.0, поскольку выпуск bash -3.2.

.,.

г. Расширение брекета теперь позволяет нулевое заполнение расширенных числовых значений и добавит правильное количество нулей, чтобы убедиться, что все значения содержат одинаковое количество цифр.

Ответ 7

Просто примечание: Я испытал разные типы поведения в разных версиях bash:

  • версия 3.1.17 (1) -release- (x86_64-suse-linux) и
  • Версия 4.1.17 (9) -release (x86_64-unknown-cygwin))

для первого (3.1) for nn in (00..99) ; do ... работает, но for nn in (000..999) ; do ... не работает оба будут работать на версии 4.1; не тестировали поведение printf (bash --version предоставил информацию о версии)

Приветствия, Ян