While loop preso em loop infinito

0

Não consigo entender por que essa função fica presa.
O que estou tentando fazer é criar uma pasta a partir de uma data de início pré-determinada até o mês atual. Infelizmente, ele conclui todas as criações de pastas e fica preso à aritmética postada abaixo.
Alguém poderia me dar uma dica para seguir o caminho certo?
Aqui está o meu código:

yearloop(){
   year=$(echo "$firstmsgdate"|cut -d"/" -f3)
   zmmailbox -z -m $account gf /archive || zmmailbox -z -m $account cf /archive
   crntmnth=$(date +"%m")
   incmonth=0
   while [ $year -le $currentyear ]; do
     if [ "$year" -lt "$currentyear" ]; then
       #do stuff
       let year++
     elif [ $year -eq $currentyear ]; then
       while [ $incmonth -lt $crntmnth ]; do
         #do otherthings
         let incmonth++
       done
     else
       echo "Else"
     fi
   done
}

Esta é a saída que recebo
    + '[' 15 -le 15 ']'

    + '[' 15 -lt 15 ']'
    + '[' 15 -eq 15 ']'

    + '[' 2 -lt 02 ']'
    + '[' 15 -le 15 ']'

    + '[' 15 -lt 15 ']'
    + '[' 15 -eq 15 ']'

    + '[' 2 -lt 02 ']'
    + '[' 15 -le 15 ']'

    
por Sean 12.02.2015 / 21:59

1 resposta

2

Quando o ano atinge o ano atual, ele nunca é incrementado novamente (o elif está em vigor), portanto, o loop while externo que testa "menor que ou igual a" ainda está em vigor. Coloque let year++ após o loop while na parte elif e ele funcionará. Ou melhor ainda ... chame break explicitamente nesse ponto. Nunca é bom confiar no loop while para terminar sozinho.

Além disso, você pode simplesmente usar sequências e pular todos os testes desajeitados:

#initialization as before
let lastyear=currentyear-1
for year in $(seq $year $lastyear); do
   #do stuff with $year
done
#now months of the current year
for month in $(seq $incmonth $crntmnth); do
   #do stuff with $month and $currentyear
done

Seu loop duplo era inútil de qualquer maneira - o ano atual acontece apenas uma vez.

    
por 12.02.2015 / 22:08