В bash, как я могу добавить целые числа с ведущими нулями и поддерживать указанный буфер
Например, я хочу считать от 001 до 100. Значение нулевого буфера начнется с 2, 1, а затем в конечном итоге 0, когда оно достигнет 100 или более.
например:
001
002
...
010
011
...
098
099
100
Я мог бы сделать это, если числа имели предопределенное количество нулей с printf "% 02d" $i. Но это статичное, а не динамическое и не будет работать в моем примере.
Ответы
Ответ 1
Если по static или dynamic вы хотите, чтобы вы могли использовать переменную ширины, вы можете сделать это:
$ padtowidth=3
$ for i in 0 {8..11} {98..101}; do printf "%0*d\n" $padtowidth $i; done
000
008
009
010
011
098
099
100
101
Звездочка заменяется значением переменной, которой она соответствует в списке аргументов ($padtowidth
в этом случае).
В противном случае единственная причина, по которой ваш пример не работает, заключается в том, что вы используете "2" (возможно, как если бы это было максимальное дополнение), когда оно должно быть "3" (как в моем примере), поскольку это значение равно результирующая общая ширина (а не только ширина прокладки).
Ответ 2
Если ваша система имеет его, попробуйте seq
с опцией -w
(--equal-width
):
$ seq -s, -w 1 10
01,02,03,04,05,06,07,08,09,10
$ for i in `seq -w 95 105` ; do echo -n " $i" ; done
095 096 097 098 099 100 101 102 103 104 105
Ответ 3
В Bash версии 4 (используйте Bash -версию) вы можете использовать расширение брекета. Полагая 0
перед любым пределом, заставляют числа заполняться нулями
echo {01..100} # 001 002 003 ...
echo {03..100..3} # 003 006 009 ...
Ответ 4
#!/bin/bash
max=100;
for ((i=1;i<=$max;i++)); do
printf "%0*d\n" ${#max} $i
done
Приведенный выше код автоматически установит ваши номера с правильным числом 0, исходя из количества цифр, которое содержит максимальное/конечное значение. Все, что вам нужно сделать, это изменить переменную max
, и она будет обрабатывать остальные.
Примеры:
макс = 10
01
02
03
04
05
06
07
08
09
10
макс = 100
001
002
003
004
005
006
...
097
098
099
100
макс = 1000
0001
0002
0003
0004
0005
0006
...
0997
0998
0999
1000
Ответ 5
# jot is available on FreeBSD, Mac OS X, ...
jot -s " " -w '%03d' 5
jot -s " " -w '%03d' 10
jot -s " " -w '%03d' 50
jot -s " " -w '%03d' 100
Ответ 6
Если вам нужно ввести значения до номера переменной с переменным заполнением:
$values_count=514;
$padding_width=5;
for i in 0 `seq 1 $(($values_count - 1))`; do printf "%0*d\n" $padding_width $i; done;
Это будет печатать 00000, 00001,... 00513.
(Я не нашел ни одного из текущих ответов, удовлетворяющих мою потребность)