Adding a zero to single digit variable

bash, directory, unix, variables

Solution

You can replace the whole lot with:

for day in 0{1..9} {10..31} ; do
    mkdir ${path}/02.${day}.2011
done

while still not having to start up any external processes (other than what may be in the loop body).

That's probably not that important here since `mkdir` is not one of those things you tend to do a lot of in a tight loop but it will be important if you write a lot of your quick and dirty code in `bash`.

Process creation is expensive when you're doing it hundreds of thousands of times as some of my scripts have occasionally done :-)

Example so you can see it in action:

pax$ for day in 0{8..9} {10..11}; do echo ${day}; done
08
09
10
11

And, if you have a recent-enough version of `bash`, it will honor your request for leading digits:

A sequence expression takes the form `{x..y[..incr]}`, where `x` and `y` are either integers or single characters, and `incr`, an optional increment, is an integer.

When integers are supplied, the expression expands to each number between `x` and `y`, inclusive.

Supplied integers may be prefixed with `0` to force each term to have the same width. When either `x` or `y` begins with a zero, the shell attempts to force all generated terms to contain the same number of digits, zero-padding where necessary.

So, on my Debian 6 box, with `bash` version 4.1.5:

pax$ for day in {08..11} ; do echo ${day} ; done
08
09
10
11

Problem

Trying to add a zero before the varaible if it's less than 10 and create said directory. I can't seem to get the zero to add correctly. Keeps resulting in making `02.1.2011`, `02.2.2011` etc,etc. ``` i=0 for i in {01..31} do if $i > 10 then mkdir $path/02.0$i.2011 else mkdir $path/02.$i.2011 fi done ```

Original source

Related problems