如何在shell中为for循环添加前导零?

我有一个循环的基本数字,在每次迭代时将variablesnum加1 …

for (( num=1; num<=5; num++ )) do echo $num done 

哪些产出:

 1 2 3 4 5 

我试图让它产生输出(在$ num之前添加前导零):

 01 02 03 04 05 

没有做:

 echo 0$num 

使用以下语法:

 $ for i in {01..05}; do echo "$i"; done 01 02 03 04 05 

如果你想使用printf ,没有什么能够阻止你把结果放在一个variables中以备后用。

 $ foo=$(printf "%02d" 5) $ echo "${foo}" 05 

免责声明:这只适用于>=bash-4

seq -w会检测宽度并对其进行标准化。

 for num in $(seq -w 01 05); do ... done 

显然这不适用于最新版本的iOS,所以你可以安装macports并使用它的seq版本,或者你可以明确地设置格式:

 seq -f '%02g' 1 3 01 02 03 

但是鉴于这样一个简单问题的格式规范的丑陋,我更喜欢Henk和Adrian给出的解决scheme,它只使用Bash。 苹果公司不能搞砸了,因为没有通用的“unix”版本的Bash:

 echo {01..05} 

要么:

 for number in {01..05}; do ...; done 

使用printf命令有0填充:

 printf "%02d\n" $num 

您的for循环将如下所示:

 for (( num=1; num<=5; num++ )); do printf "%02d\n" $num; done 01 02 03 04 05 

我不想把它输出到屏幕上(这是printf主要用于的,对吧?)variables$ num将被用作另一个程序的参数,但让我看看我能做些什么。

你仍然可以使用printf

 for num in {1..5} do value=$(printf "%02d" $num) ... Use $value for your purposes done 

为什么不printf '%02d' $num ? 请参阅此内部bash命令的help printf

只是一个说明:我在不同版本的bash上经历了不同的行为:

  • 版本3.1.17(1)-release-(x86_64-suse-linux)和
  • 版本4.1.17(9)-release(x86_64-unknown-cygwin))

for nn in (00..99) ; do ...的前者(3.1) for nn in (00..99) ; do ... for nn in (00..99) ; do ...工作,但for nn in (000..999) ; do ... for nn in (000..999) ; do ...不起作用都将工作在版本4.1; 还没有testing过printf行为( bash --version给出了版本信息)

干杯,1月

从bash 4.0开始,你可以使用Brace Expansion和固定长度的string。 请参阅下面的原始公告。

它只会做你需要的东西,而且不需要shell的任何东西。

 $ echo {01..05} 01 02 03 04 05 for num in {01..05} do echo $num done 01 02 03 04 05 

从bash / NEWS文件中

这是自bash-3.2发布以来添加到bash-4.0的新function的简要描述。

。 。 。

ž。 大括号扩展现在允许扩展数字值的零填充,并将添加适当数量的零,以确保所有值包含相同的数字位数。