shell 在bash中,我如何添加带前导零的整数并维护指定的缓冲区

xn1cxnb4  于 2023-10-23  发布在  Shell
关注(0)|答案(7)|浏览(131)

例如,我想从001数到100。这意味着零缓冲区将从2,1开始,然后当它达到100或更多时最终为0。
例如:001 002... 010 011 ... 098 099 100
我可以这样做,如果数字有一个预定义的数字与printf“%02d”$i。但这是静态的,而不是动态的,在我的例子中不起作用。

uplii1fm

uplii1fm1#

如果静态与动态的意思是你希望能够使用一个变量的宽度,你可以这样做:

$ 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”(就像我的例子一样),因为这个值是结果的总宽度(而不是唯一的填充宽度)。

de90aj5v

de90aj5v2#

如果您的系统有seq,请使用-w--equal-width)选项尝试seq

$ 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
y0u0uwnf

y0u0uwnf3#

在Bash版本4(使用bash -version)中,你可以使用大括号扩展。将0置于任一限制之前,会强制数字填充零

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

xxb16uws4#

#!/bin/bash

max=100; 

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

上面的代码将根据max/terminal值包含的位数自动填充正确的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
k4emjkb1

k4emjkb15#

# 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
jq6vz3qz

jq6vz3qz6#

如果您需要使用变量填充将值填充到一个变量数字:

$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.(我没有找到任何当前的答案满足我的需求)

epfja78i

epfja78i7#

补充@DennisWilliamson的answer
seq-f参数是实现相同目的的一种可能方式:

$ seq -f "%03g" 1 100
001
002
003
...
098
099
100

在这里,3根据需要设置要用前导零填充的位数,并且可以设置为任何正整数。不过,这可能需要足够新的seq版本。看看@AminAbbaspour的answer in another thread,功劳归谁。
如果需要的话,上述输出可以在echo(如果前面提到的大括号扩展不是一个选项)和printf中使用。例如:

$ for i in $(seq -f "%03g" 1 100); do echo "file-${i}.log"; done
file-001.log
file-002.log
file-003.log
...
file-098.log
file-099.log
file-100.log

当然,对于这种简单的情况,通过for循环和printf/echo的迂回可能是多余的-seq单独可以产生相同的输出:

seq -f "file-%03g.log" 1 100

相关问题