Padding zeros in a string

前端 未结 7 550
情话喂你
情话喂你 2020-12-24 10:03

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 t

相关标签:
7条回答
  • 2020-12-24 10:42

    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
    
    0 讨论(0)
  • 2020-12-24 10:46
    n=`printf '%03d' "2"`
    

    Note spacing and backticks

    0 讨论(0)
  • 2020-12-24 10:53

    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  
    
    0 讨论(0)
  • 2020-12-24 10:54

    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.

    0 讨论(0)
  • 2020-12-24 10:59

    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
    
    0 讨论(0)
  • 2020-12-24 11:00

    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.

    0 讨论(0)
提交回复
热议问题