在字符串中填充零

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

我尝试了以下方法:

n=1


n = printf %03d $n


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

但是变量 n’不能永久填充。我怎样才能使它永久?

94100 次浏览

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.

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

Note spacing and backticks

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

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.

Attention though if your input string has a leading zero!
printf will still do the padding, but also convert your string to hex octal format.

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


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

A solution to this seems to be printing a float instead of decimal.
The trick is omitting the decimal places with .0f.

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


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

to avoid context switching:

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

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

Just typing this here for additional information.

If you know the number of zeroes you need, you can use the string concatenation:

let pad="0"
pad+=1
echo $pad # this will print 01