Как добавить начальные нули для 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
Ответы
Ответ 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
предоставил информацию о версии)
Приветствия, Ян