我有一个基本的数字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
为什么不是printf '%02d' $num?这个内部bash命令参见help printf。
printf '%02d' $num
help printf
使用printf命令设置0填充:
printf
0
printf "%02d\n" $num
你的for循环是这样的:
for (( num=1; num<=5; num++ )); do printf "%02d\n" $num; done 01 02 03 04 05
seq -w将检测最大输入宽度并将输出宽度归一化。
seq -w
for num in $(seq -w 01 05); do ... done
在撰写本文时,这还不能在最新版本的OSX上运行,所以你可以安装macports并使用它的seq版本,或者你可以显式地设置格式:
seq
seq -f '%02g' 1 3 01 02 03
但是考虑到这样一个简单问题的格式规范很糟糕,我更喜欢Henk和Adrian给出的解决方案,它只使用Bash。苹果不会搞砸的,因为没有通用的“unix”。Bash版本:
echo {01..05}
或者:
for number in {01..05}; do ...; done
使用以下语法:
$ for i in {01..05}; do echo "$i"; done 01 02 03 04 05
声明:前导零仅在>=bash-4中有效。
>=bash-4
如果你想使用printf,没有什么可以阻止你将其结果放在变量中以供进一步使用:
$ foo=$(printf "%02d" 5) $ echo "${foo}" 05
从bash 4.0开始,你可以使用带有固定长度字符串的支架扩张。请参见下面的原始公告。
它将满足您的需要,并且不需要外壳以外的任何东西。
$ 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的发布 …… 大括号展开现在允许对展开的数值进行零填充,并将添加适当数量的零,以确保所有值包含相同数量的数字。
……
大括号展开现在允许对展开的数值进行零填充,并将添加适当数量的零,以确保所有值包含相同数量的数字。
我对输出到屏幕不感兴趣(这就是printf的主要用途,对吧?)变量$num将被用作另一个程序的参数,但让我看看我能做什么。
你仍然可以使用printf:
for num in {1..5} do value=$(printf "%02d" $num) ... Use $value for your purposes done
对于前者(3.1)for nn in (00..99) ; do ...工作,但for nn in (000..999) ; do ...不工作 两者都将适用于4.1版本;还没有测试printf行为 (bash --version给出了版本信息)
for nn in (00..99) ; do ...
for nn in (000..999) ; do ...
bash --version
欢呼,简