填充字符串中的零

62 bash

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

我尝试了以下方法:

n=1

n = printf %03d $n

wget http://aolradio.podcast.aol.com/sn/SN-$n.mp3
Run Code Online (Sandbox Code Playgroud)

但变量'n'不会永久保留填充.我怎样才能永久化?

Chr*_*heD 81

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

n=1
wget http://aolradio.podcast.aol.com/sn/SN-`printf %03d $n`.mp3
Run Code Online (Sandbox Code Playgroud)

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

n=`printf %03d $n`
Run Code Online (Sandbox Code Playgroud)

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

  • 为什么不:`wget $(printf http://aolradio.podcast.aol.com/sn/SN-%03d $ n.mp3,$ n)`.只需将整个URL放在`printf`语句中. (5认同)

nos*_*nos 35

看起来你要分配printf命令的返回值(这是它的退出代码),你想要分配printf的输出.

bash-3.2$ n=1
bash-3.2$ n=$(printf %03d $n)
bash-3.2$ echo $n
001
Run Code Online (Sandbox Code Playgroud)

  • +1使用$() - 它比反引号更可取 (9认同)
  • @bli它可以嵌套,而反引号则不能(至少没有某种形式的转义) (3认同)
  • 为什么$()更好? (2认同)

UnS*_*per 17

如果您的输入字符串具有前导零,请注意!
printf仍将执行填充,但也将您的字符串转换为十六进制八进制格式.

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

# but not for numbers over 8
$ echo `printf "%05d" 033`
00027
Run Code Online (Sandbox Code Playgroud)

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

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

# as well as without
$ echo `printf "%05.0f" 33`
00033
Run Code Online (Sandbox Code Playgroud)

  • 那是因为 printf 将 "0n" 视为八进制。八进制 33 = 十进制 27。不是十六进制。 (2认同)

小智 10

避免上下文切换:

a="123"
b="00000${a}"
c="${b: -5}"
Run Code Online (Sandbox Code Playgroud)