我正在编写bash脚本以获取一些播客。问题在于,某些播客编号是一位数字,而其他的是2/3位数字,因此我需要填充它们以使其全部变为3位数字。
我尝试了以下方法:
n=1
n = printf %03d $n
wget http://aolradio.podcast.aol.com/sn/SN-$n.mp3
但是变量'n'不会永久填充。我如何使其永久化?
我正在编写bash脚本以获取一些播客。问题在于,某些播客编号是一位数字,而其他的是2/3位数字,因此我需要填充它们以使其全部变为3位数字。
我尝试了以下方法:
n=1
n = printf %03d $n
wget http://aolradio.podcast.aol.com/sn/SN-$n.mp3
但是变量'n'不会永久填充。我如何使其永久化?
Answers:
使用反引号指定printf命令(``)的结果:
n=1
wget http://aolradio.podcast.aol.com/sn/SN-`printf %03d $n`.mp3
编辑:请注意,我删除了实际上不是必需的一行。如果要将'printf%...'的输出分配给n,则可以使用
n=`printf %03d $n`
然后,使用之前使用的$ n变量替换。
但是请注意,如果您的输入字符串的前导零!
printf仍然会进行填充,但是还会将您的字符串转换为十六进制八进制格式。
# 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
n=`printf '%03d' "2"`
注意间距和反引号
这是对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
wget $(printf http://aolradio.podcast.aol.com/sn/SN-%03d $n.mp3, $n)
?只需将整个URL放入printf
语句中即可。