在 bash 中,如何添加带有前导零的整数并维护指定的缓冲区
例如,我想从 001 数到 100。这意味着零缓冲区将从 2、1 开始,当达到 100 或更多时最终为 0。
前任: 001 002 ... 010 011 ... 098 099 100
如果数字具有 printf "%02d" $i 预定义的零个数,我就可以做到这一点 。但这是静态的而不是动态的,在我的示例中不起作用。
For example, I want to count from 001 to 100. Meaning the zero buffer would start off with 2, 1, then eventually 0 when it reaches 100 or more.
ex:
001
002
...
010
011
...
098
099
100
I could do this if the numbers had a predefined number of zeroes with printf "%02d" $i. But that's static and not dynamic and would not work in my example.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
如果通过静态与动态您的意思是您希望能够使用宽度变量,您可以这样做:
星号被替换为参数列表中它对应的变量值(
$ padtowidth 在本例中)。
否则,您的示例不起作用的唯一原因是您使用“2”(也许它是要应用的最大填充),而它应该是“3”(如我的示例中),因为该值是结果总数宽度(不是仅焊盘宽度)。
If by static versus dynamic you mean that you'd like to be able to use a variable for the width, you can do this:
The asterisk is replaced by the value of the variable it corresponds to in the argument list (
$padtowidth
in this case).Otherwise, the only reason your example doesn't work is that you use "2" (perhaps as if it were the maximum padding to apply) when it should be "3" (as in my example) since that value is the resulting total width (not the pad-only width).
如果您的系统有,请尝试使用
seq
和-w
(--equal-width
) 选项:If your system has it, try
seq
with the-w
(--equal-width
) option:在 Bash 版本 4(使用 bash -version)中,您可以使用 大括号扩展。在任一限制之前放置
0
会强制数字用零填充In Bash version 4 (use bash -version) you can use brace expansion. Putting a
0
before either limit forces the numbers to be padded by zeros上面的代码将根据最大/最终值包含的位数,自动用正确数量的 0 填充您的数字。您所需要做的就是更改
max
变量,它将处理其余的事情。示例:
最大值=10
最大值=100
最大值=1000
The code above will auto-pad your numbers with the correct number of 0's based upon how many digits the max/terminal value contains. All you need to do is change the
max
variable and it will handle the rest.Examples:
max=10
max=100
max=1000
如果您需要使用可变填充将值填充到可变数字:
这将打印出 00000, 00001, ... 00513。
(我没有找到任何当前的答案满足我的需要)
If you need to pad values up to a variable number with variable padding:
This would print out 00000, 00001, ... 00513.
(I didn't find any of the current answers meeting my need)
为了补充@DennisWilliamson的答案:
seq
的-f
参数是实现相同目的的一种可能方法:这里,
3
设置根据需要用前导零填充的位数,并且可以设置为任何正整数。不过,这可能需要足够新的seq
版本。请参阅 @AminAbbaspour 在另一个帖子中的答案,这归功于谁。上面的输出可以在
echo
中使用(如果前面提到过大括号扩展不是一个选项)和printf
,如果有必要的话。例如:当然,对于这种简单的情况,通过
for
循环和printf
/echo
绕道可能会有点过分 –seq 单独可以产生相同的输出:
To complement @DennisWilliamson's answer:
seq
's-f
parameter is a possible way to achieve the same:Here,
3
sets the number of digits to pad with leading zeros as necessary, and can be set to any positive integer. This might require a sufficiently recent version ofseq
, though. See @AminAbbaspour's answer in another thread, who the credit goes to.Above output could be used in both
echo
(if its before-mentioned brace expansion isn't an option) andprintf
, as well, if necessary. E.g.:Of course, for such simple cases, the detour via
for
loop andprintf
/echo
might be overkill –seq
alone can produce the same output: