Search code examples
bashnumberspadding

How to zero pad a sequence of integers in bash so that all have the same width?


I need to loop some values,

for i in $(seq $first $last)
do
    does something here
done

For $first and $last, I need it to be of fixed length 5. So if the input is 1, I need to add zeros in front such that it becomes 00001. It loops till 99999 for example, but the length has to be 5.

E.g.: 00002, 00042, 00212, 12312 and so forth.

Any idea on how I can do that?


Solution

  • In your specific case though it's probably easiest to use the -f flag to seq to get it to format the numbers as it outputs the list. For example:

    for i in $(seq -f "%05g" 10 15)
    do
      echo $i
    done
    

    will produce the following output:

    00010
    00011
    00012
    00013
    00014
    00015
    

    More generally, bash has printf as a built-in so you can pad output with zeroes as follows:

    $ i=99
    $ printf "%05d\n" $i
    00099
    

    You can use the -v flag to store the output in another variable:

    $ i=99
    $ printf -v j "%05d" $i
    $ echo $j
    00099
    

    Notice that printf supports a slightly different format to seq so you need to use %05d instead of %05g.