填充字符串中的零

时间:2009-07-12 22:51:38

标签: bash

我正在编写一个bash脚本来获取一些播客。问题是一些播客号码是一位数,而其他播客号码是两位/三位数,因此我需要填写它们以使它们全部为3位数。

我尝试了以下内容:

n=1

n = printf %03d $n

wget http://aolradio.podcast.aol.com/sn/SN-$n.mp3

但变量'n'不会永久保留填充。我怎样才能使它成为永久性的?

7 个答案:

答案 0 :(得分:77)

使用反引号来分配printf命令的结果(``):

n=1
wget http://aolradio.podcast.aol.com/sn/SN-`printf %03d $n`.mp3

编辑:请注意,我删除了一行并不是必需的。 如果要将'printf%...'的输出分配给n,则可以 使用

n=`printf %03d $n`

之后,使用之前使用的$ n变量替换。

答案 1 :(得分:33)

似乎你要分配printf命令的返回值(这是它的退出代码),你想要分配printf的输出。

bash-3.2$ n=1
bash-3.2$ n=$(printf %03d $n)
bash-3.2$ echo $n
001

答案 2 :(得分:17)

但是如果你的输入字符串有一个前导零,请注意! printf仍将执行填充,但也将您的字符串转换为 hex 八进制格式。

# looks ok
$ echo `printf "%05d" 03`
00003

# but not for numbers over 8
$ echo `printf "%05d" 033`
00027

对此的解决方案似乎是打印浮点数而不是小数 诀窍是省略.0f的小数位。

# works with leading zero
$ echo `printf "%05.0f" 033`
00033

# as well as without
$ echo `printf "%05.0f" 33`
00033

答案 3 :(得分:9)

避免上下文切换:

a="123"
b="00000${a}"
c="${b: -5}"

答案 4 :(得分:4)

n=`printf '%03d' "2"`

注意间距和反引号

答案 5 :(得分:3)

正如noselad所提到的那样,请命令替换,即$(...),因为它取代了后卫,即`...`

在尝试嵌套多个命令替换而不是转义(即“反斜杠”)时,更容易使用。

答案 6 :(得分:0)

这是对cC Xx给出的答案的回应。 仅在a的值小于5个数字之前,该参数才起作用。

考虑何时a=12345678。 它将截断前导数字:

a="12345678" 
b="00000${a}" 
c="${b: -5}" 
echo "$a, $b, $c"

这将提供以下输出:

12345678, 0000012345678, 45678

放置if来检查a的值小于5位,然后这样做可以解决:

if [[ $a -lt 9999 ]] ; then b="00000${a}" ; c="${b: -5}" ;  else c=$a; fi