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

当前回答

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

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

对于前者(3.1),对于nn在(00..99);做……适用于nn在(000..999);做……不起作用 两者都将适用于4.1版本;还没有测试printf行为 (bash——version给出版本信息)

欢呼,简

其他回答

为什么不打印'%02d' $num?关于这个内部bash命令,请参阅help printf。

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

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

对于前者(3.1),对于nn在(00..99);做……适用于nn在(000..999);做……不起作用 两者都将适用于4.1版本;还没有测试printf行为 (bash——version给出版本信息)

欢呼,简

使用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的主要用途,对吧?)变量$num将被用作另一个程序的参数,但让我看看我能做什么。

你仍然可以使用printf:

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

Seq -w将检测最大输入宽度并标准化输出宽度。

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

在撰写本文时,这还不能在最新版本的OSX上运行,所以你可以安装macports并使用它的seq版本,或者你可以显式地设置格式:

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

但是考虑到这样一个简单问题的格式规范很糟糕,我更喜欢Henk和Adrian给出的解决方案,它只使用Bash。苹果不会搞砸的,因为没有通用的“unix”版本的Bash:

echo {01..05}

Or:

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