Padding zeros in a string

Viewed 92288

I'm writing a bash script to get some podcasts. The problem is that some of the podcast numbers are one digits while others are two/three digits, therefore I need to pad them to make them all 3 digits.

I tried the following:

n=1

n = printf %03d $n

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

but the variable 'n' doesn't stay padded permanently. How can I make it permanent?

7 Answers

Use backticks to assign the result of the printf command (``):

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

EDIT: Note that i removed one line which was not really necessary. If you want to assign the output of 'printf %...' to n, you could use

n=`printf %03d $n`

and after that, use the $n variable substitution you used before.

Seems you're assigning the return value of the printf command (which is its exit code), you want to assign the output of printf.

bash-3.2$ n=1
bash-3.2$ n=$(printf %03d $n)
bash-3.2$ echo $n
001
n=`printf '%03d' "2"`

Note spacing and backticks

As mentioned by noselad, please command substitution, i.e. $(...), is preferable as it supercedes backtics, i.e. `...`.

Much easier to work with when trying to nest several command substitutions instead of escaping, i.e. "backslashing", backtics.

This is in response to an answer given by cC Xx. It will work only until a's value less is than 5 digits.

Consider when a=12345678. It'll truncate the leading digits:

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

This gives the following output:

12345678, 0000012345678, 45678

Putting an if to check value of a is less than 5 digits and then doing it could be solution:

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