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

StackOverflow https://stackoverflow.com/questions/3191067

  •  02-10-2019
  •  | 
  •  

Вопрос

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

Ex: 001 002 ... 010 011 ... 098 099 100

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

Это было полезно?

Решение

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

$ 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 Version 4 (используйте Bash -version) Вы можете использовать Расширение скобки. Отказ Положить а 0 Перед либо ограничение заставляет числа быть дополненными Zeros

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 / Terminal. Все, что вам нужно сделать, это изменить max Переменная, и она будет справиться с остальными.

Примеры:

Макс = 10.

01
02
03
04
05
06
07
08
09
10

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top