在 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 中,如何添加带前导零的整数并维护指定的缓冲区的主要内容,如果未能解决你的问题,请参考以下文章
QT学习之如何在QToolBar中添加带图标的QToolButton并设置图标大小