while ループが無限ループに閉じ込められました。

while ループが無限ループに閉じ込められました。

この機能がなぜ詰まっているのか理解できません。
私がしたいのは、予定された開始日から当月までのフォルダを作成することです。残念ながら、すべてのフォルダの作成が完了し、以下に公開された操作が中断されます。
誰でも私が正しい道に行くためにヒントを与えることができますか?
これは私のコードです。

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
}

これは私が受け取る出力です。
+ '[' 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 -乐15 ']'

答え1

年が現在の年に達すると再び増加しないため(有効にelif)、while「小さいか等しい」をテストする外部ループは引き続き機能します。部品のループの後ろに置くとlet year++機能します。あるいは、より良い方法は...この時点で明示的に呼び出すことです。依存性ループがそれ自体で終了することは決して良くありません。whileelifbreakwhile

また、単にシーケンスを使用し、すべての厄介なテストをスキップすることができます。

#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

とにかく二重ループは役に立たない。今年は一回だけ発生します。

関連情報