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

时间:2013-08-27 08:03:23

标签: bash for-loop

我有一个循环的基本数字,它在每次迭代时将变量num递增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

7 个答案:

答案 0 :(得分:174)

使用以下语法:

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

如果您想使用printf,则没有什么可以阻止您将其结果放入变量中以供进一步使用:

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

免责声明:此功能仅适用于>=bash-4

答案 1 :(得分:41)

seq -w将检测宽度并将其标准化。

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

显然这不适用于最新版本的iOS,因此您可以安装macport并使用其seq版本,也可以明确设置格式:

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

但鉴于这种简单问题的格式规范的丑陋,我更喜欢Henk和Adrian给出的解决方案,它只使用了Bash。由于没有通用的“unix”版本的Bash,Apple无法解决这个问题:

echo {01..05}

或者:

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

答案 2 :(得分:27)

使用printf命令进行0填充:

printf "%02d\n" $num

你的for循环将是这样的:

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

答案 3 :(得分:15)

  

我对将它输出到屏幕不感兴趣(这就是printf主要用于的,对吧?)变量$ num将被用作另一个程序的参数,但是让我看看我能做些什么此

您仍然可以使用printf

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

答案 4 :(得分:8)

从bash 4.0开始,你可以使用带有固定长度字符串的 Brace Expansion 。请参阅下面的原始公告。

它可以满足您的需求,并且不需要任何外部的外壳。

$ echo {01..05}
01 02 03 04 05

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

CHANGES, release bash-4.0, section 3

  

这是对bash-4.0以后添加的新功能的简要描述   bash-3.2的发布。

     

。 。

     
    

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

  

答案 5 :(得分:6)

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

答案 6 :(得分:1)

请注意: 我在不同版本的bash上经历过不同的行为:

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

对于前者(3.1)for nn in (00..99) ; do ...有效,但for nn in (000..999) ; do ...不起作用 两者都适用于4.1版;尚未测试printf行为 (bash --version提供了版本信息)

干杯,Jan