Search code examples
bashshellprintf

printf in bash: "09" and "08" are invalid numbers, "07" and "06" are fine


This is my bash script - I just want to left-pad a set of numbers with zeroes:

printf "%04d" "09"
printf "%04d" "08"
printf "%04d" "07"
printf "%04d" "06"

Output:

./rename.sh: line 3: printf: 09: invalid number 
0000
./rename.sh: line 4: printf: 08: invalid number 
0000 
0007
0006

What...?

Only 09 and 08 are causing the problem: every other number in my sequence seems to be OK.


Solution

  • If you have your "09" in a variable, you can do

    a="09"
    echo "$a"
    echo "${a#0}"
    printf "%04d" "${a#0}"
    

    Why does this help? Well, a number literal starting with 0 but having no x at the 2nd place is interpreted as octal value.

    Octal value only have the digits 0..7, 8 and 9 are unknown.

    "${a#0}" strips one leading 0. The resulting value can be fed to printf then, which prints it appropriately, with 0 prefixed, in 4 digits.

    If you have to expect that you get values such as "009", things get more complicated as you'll have to use a loop which eliminates all excess 0s at the start, or an extglob expression as mentioned in the comments.