我正在编写一个bash脚本来获取一些播客。问题是一些播客号码是一位数,而其他播客号码是两位/三位数,因此我需要填写它们以使它们全部为3位数。
我尝试了以下内容:
n=1
n = printf %03d $n
wget http://aolradio.podcast.aol.com/sn/SN-$n.mp3
但变量'n'不会永久保留填充。我怎样才能使它成为永久性的?
答案 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