別の関数を呼び出した後、ループは停止します

別の関数を呼び出した後、ループは停止します

簡単に言うと、関数があります。それは下記の「months_and_days」と呼ばれます。その目的は、1 日あたり 24 個のログを作成し、それを「年-月」ディレクトリに格納することです。

下部に「main」という 2 番目の関数があります。main は、12 か月間の単純な for ループに基づいてディレクトリを作成します。main 関数がこれらのディレクトリを作成した後、ダミー ログ ファイルを入力するために「months_and_days」関数を呼び出します。

何らかの理由で、最初の月のディレクトリ「2018-01」のみが作成され、データが取り込まれ、その後停止します...

これまで bash でスクリプトを作成したことがないので、months_and_days が終了した後、なぜメイン関数に戻ってループを完了しないのかわかりません。

メイン関数を再度呼び出して、メイン ループのグローバル変数を保持する必要がありますか?

以下のコード:

months=12
testDir=/home/name/bashScripts/testDir
fileToCopyPath=/opt/logs/192.168.217.129/2019-11/1-192.168.217.129-2019-11-24-13.log
currentMonth=0



function months_and_days () {
        declare -a daysArr=(31 28 31 30 31 30 31 31 30 31 30 31)
        for ((i=1; i<=${daysArr[$1]}; i++))
                do
                        for ((j=0; j<=23; j++ ))
                        do
                                if [ $j -le 9 ]
                                then
                                        tar -czvf $testDir/2018-$currentMonth/1-192-168-217-129-2018-$currentMonth-$i-0$j.tar.gz $fileToCopyPath
                                else
                                        tar -czvf $testDir/2018-$currentMonth/1-192-168-217-129-2018-$currentMonth-$i-$j.tar.gz $fileToCopyPath
                                fi
                        done
                done
}

function main () {
for ((i=1; i<=$months; i++))
do
        if [ $i -le 9 ]
        then
                mkdir $testDir/2018-0$i
                chmod 775 $testDir/2018-0$i
                currentMonth=0$i
                months_and_days "$i-1"

        else
                mkdir $testDir/2018-$i
                chmod 775 $testDir/2018-$i
                currentMonth=$i
                months_and_days "$i-1"
        fi
done
}

main

答え1

imainは、関数と関数の両方で変更されるグローバル変数ですmonths_and_days。したがって、months_and_days の最初の呼び出し後、i の値は 32 (1 月の日数より 1 つ多い) になり、$months よりも大きくなるため、処理は停止します。

追加

local i

これを修正するには、 months_and_days の最初の行として追加します。

関連情報