Adding a zero to single digit variable

前端 未结 10 2074
星月不相逢
星月不相逢 2021-01-30 05:31

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.20

相关标签:
10条回答
  • 2021-01-30 05:55

    I created this simple utility to perform this, Good Luck , hope this helps stack'ers!!

    for i in {1..24}
    do
    charcount=`echo $i|wc -m`
    count=`expr $charcount - 1`
    if [ $count -lt 2 ];
    then
    i="0`echo $i`"
    fi
    echo "$i"
    done
    
    0 讨论(0)
  • 2021-01-30 05:57

    Better:

    for i in $(seq -f %02g 1 31)
    do
        mkdir "$path/02.$i.2011"
    done
    

    Or even:

    for i in {01..31}
    do
        mkdir "$path/02.$(printf "%02d" $i).2011"
    done
    
    0 讨论(0)
  • 2021-01-30 05:58

    You can use

    $(printf %02d $i)
    

    To generate the numbers with the format you want.

    for i in $(seq 0 1 31)
    do
        mkdir $path/02.$(printf %02d $i).2011
    done
    
    0 讨论(0)
  • 2021-01-30 06:06

    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
    
    0 讨论(0)
  • 2021-01-30 06:09
    $ seq --version | head -1
    seq (GNU coreutils) 8.21
    $ seq -f "%02g" 1 10
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    
    0 讨论(0)
  • 2021-01-30 06:11

    Your if/then statement is backwards. You are adding a 0 when it is a above 10, not adding one when it is below.

    Another bug is that you make the cutoff strictly greater than 10, which does not include 10, even though 10 is two digits.

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