Forループは他の関数を呼び出すと停止します。

Forループは他の関数を呼び出すと停止します。

簡単に言うと機能があります。以下では「月_及び_日」といいます。目的は、1 日に 24 個のログを生成して「年 - 月」ディレクトリに配置することです。

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

何らかの理由で最初の数ヶ月間だけ「2018-01」ディレクトリを作成して入力し、停止します。

以前はbashでスクリプトを書いたことがないので、なぜMonth_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より大きいため、ジョブは停止します。

1つ追加

local i

Month_and_daysの最初の行に修正してください。

おすすめ記事