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

Posted

技术标签:

【中文标题】在 bash 中,如何添加带前导零的整数并维护指定的缓冲区【英文标题】:In bash, how could I add integers with leading zeroes and maintain a specified buffer 【发布时间】:2011-03-12 14:07:30 【问题描述】:

例如,我想从 001 数到 100。这意味着零缓冲区将从 2、1 开始,然后在达到 100 或更多时最终为 0。

例如: 001 002 ... 010 011 ... 098 099 100

如果数字有预定义的零个数,printf "%02d" $i,我可以这样做。但这是静态的而不是动态的,在我的示例中不起作用。

【问题讨论】:

欢迎来到 ***。请务必选择您认为最能解决您的问题的答案(通过复选标记),以便其他人可以从所提出的知识中受益。 How to zero pad a sequence of integers in bash so that all have the same width?的可能重复 【参考方案1】:

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

$ 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)。

否则,您的示例不起作用的唯一原因是您在应该为“3”(如我的示例中)时使用“2”(可能好像它是要应用的最大填充),因为该值是得到的总宽度(不是 pad-only 宽度)。

【讨论】:

是的,在 bash 脚本中使用 zsh 可能是对的。我忽略了你的方法。你的和 SiegeX 非常适合我的需要。谢谢。【参考方案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 位数字的整数(例如:100)时,它才会缓冲 3 个零。如果它只达到 99,它将只包含一个带有 2 个零的缓冲区。抱歉,我没有具体说明。 约翰内斯。是的,你是对的。此方法也可以正常工作。我不知道我昨天在跑什么。谢谢。 这个答案应该被接受为正确答案。最优雅的解决方案。 :) 谢谢暴徒!【参考方案3】:

在 Bash 版本 4(使用 bash -version)中,您可以使用 brace expansion。在任一限制之前放置 0 会强制数字用零填充

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

【讨论】:

这需要 Bash 4。早期版本不会在大括号扩展中进行填充。 感谢约翰内斯和丹尼斯。是的,我发现这需要 bash 4。我不使用它。我发现虽然我可以以同样的方式使用 zsh。 for i in $(zsh -c "echo $FROM..$TO")do echo $i;done 工作正常,不必编写任何过于复杂的脚本。 @readdit:从 bash 脚本调用 zsh 似乎相当浪费。要么在 zsh 中编写整个脚本(它具有高水平的 Bash 兼容性,尽管有些东西足够不同,您必须进行一些修改)或使用 bash 的内置功能,例如我在我的文章中展示的 printf 技术回答。还有其他技术也可以仅使用 shell 内置函数。【参考方案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。 (我没有找到任何符合我需要的当前答案)

【讨论】:

以上是关于在 bash 中,如何添加带前导零的整数并维护指定的缓冲区的主要内容,如果未能解决你的问题,请参考以下文章

如何打印带有前导零的二进制整数?

UITableViewCell如何添加带圆角的实心边框

QT学习之如何在QToolBar中添加带图标的QToolButton并设置图标大小

带前导零的 Barcode4j UPCA 扫描码

Android LinearLayout:在 LinearLayout 周围添加带阴影的边框

如何在 JavaScript 中输出带有前导零的数字? [复制]