В Bash, как я могу добавить целые числа с ведущими нулями и поддерживать указанный буфер - PullRequest
29 голосов
/ 07 июля 2010

Например, я хочу считать от 001 до 100. Это означает, что нулевой буфер будет начинаться с 2, 1, а затем со временем 0, когда он достигнет 100 или более.

например: 001 002 ... 010 011 ... 098 099 100

Я мог бы сделать это, если бы числа имели предопределенное число нулей с printf "% 02d" $ i. Но это статично, а не динамично и не будет работать в моем примере.

Ответы [ 6 ]

33 голосов
/ 07 июля 2010

Если под статическим и динамическим вы подразумеваете, что хотите использовать переменную ширины, вы можете сделать это:

$ 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» (как в моем примере), так как это значение итоговая общая ширина (не ширина только для пэдов).

33 голосов
/ 07 июля 2010

Если ваша система имеет его, попробуйте 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
12 голосов
/ 07 июля 2010

В Bash версии 4 (используйте bash -version) вы можете использовать расширение скобки .Если поставить 0 перед любым пределом, числа будут дополнены нулями

echo {01..100} # 001 002 003 ...
echo {03..100..3} # 003 006 009 ...
5 голосов
/ 07 июля 2010
#!/bin/bash

max=100; 

for ((i=1;i<=$max;i++)); do 
    printf "%0*d\n" ${#max} $i
done

Приведенный выше код автоматически дополнит ваши номера правильными числами 0 в зависимости от того, сколько цифр содержит максимальное / конечное значение.Все, что вам нужно сделать, это изменить переменную max, и она обработает все остальное.

Примеры:

max = 10

01
02
03
04
05
06
07
08
09
10

max = 100

001
002
003
004
005
006
...
097
098
099
100

max = 1000

0001
0002
0003
0004
0005
0006
...
0997
0998
0999
1000
4 голосов
/ 07 июля 2010
# 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   
0 голосов
/ 13 марта 2017

Если вам нужно дополнить значения до переменного числа с помощью переменной padding:

$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. (Я не нашел ни одного из текущих ответов, отвечающих моим потребностям)

...