For-Schleife wird nach dem Aufruf einer anderen Funktion beendet

For-Schleife wird nach dem Aufruf einer anderen Funktion beendet

Kurz gesagt, ich habe eine Funktion. Sie heißt weiter unten „months_and_days“. Ihr Zweck besteht darin, 24 Protokolle pro Tag zu erstellen und sie in einem „year-month“-Verzeichnis abzulegen.

Ich habe weiter unten eine zweite Funktion namens „main“. Main erstellt Verzeichnisse basierend auf einer einfachen For-Schleife für 12 Monate. Nachdem die Hauptfunktion diese Verzeichnisse erstellt hat, ruft sie die Funktion „months_and_days“ auf, um sie mit Dummy-Protokolldateien zu füllen.

Aus irgendeinem Grund wird nur das Verzeichnis „2018-01“ für die ersten Monate erstellt und aufgefüllt, und dann wird es gestoppt …

Ich habe noch nie zuvor in Bash Skripte erstellt und bin mir daher nicht sicher, warum nach Abschluss von months_and_days nicht zur Hauptfunktion zurückgekehrt wird, um deren Schleife abzuschließen.

Muss ich die Hauptfunktion erneut aufrufen und eine globale Variable für die Hauptschleife beibehalten?

Code unten:

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

Antwort1

imainist eine globale Variable, die sowohl in der als auch in der Funktion geändert wird months_and_days. Nach dem ersten Aufruf von months_and_days ist der Wert von i also 32 (eins mehr als die Anzahl der Tage in Januar) und damit größer als $months, sodass alles gestoppt wird.

Füge hinzu ein

local i

als erste Zeile in Monate_und_Tage, um das Problem zu beheben.

verwandte Informationen