В bash, как я могу добавить целые числа с ведущими нулями и поддерживать указанный буфер

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

ex: Ноль ноль один Ноль ноль два ... Ноль десять Ноль одиннадцать ... Ноль девяносто восемь Ноль девяносто девять 100

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

6 ответов


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

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


если ваша система имеет, попробовать 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

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

echo {01..100} # 001 002 003 ...
echo {03..100..3} # 003 006 009 ...

#!/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

# 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   

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

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