
簡単に言うと、関数があります。それは下記の「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
i
main
は、関数と関数の両方で変更されるグローバル変数ですmonths_and_days
。したがって、months_and_days の最初の呼び出し後、i の値は 32 (1 月の日数より 1 つ多い) になり、$months よりも大きくなるため、処理は停止します。
追加
local i
これを修正するには、 months_and_days の最初の行として追加します。