У меня есть массив строк, представляющих даты:
filedates=()
Мне нужно найти самую старую дату в массиве, сравнивая текущий элемент с временной самой старой датой ($ tempOldestDate)
После нахождения самой старой даты в массиве я проверяю, есть ли в массиве три элемента с такой же датой. Если нет 3 элементов, соответствующих дате, я удаляю эти элементы. Логи c У меня по этой части отлично работает. Я печатаю исходный массив, а затем результирующий массив, и он ясно показывает, что эти элементы были удалены:
Часть, с которой я борюсь, это когда я пытаюсь вызвать мой find_oldest_date Метод снова из метода remove_oldest_date с массивом result . Вызов $ set_temp_oldest_date с массивом $ result работает, как и ожидалось. Но выполнение вызова сразу после $ find_oldest_date продолжает возвращать удаленный элемент ... Я не могу понять, почему он продолжает включать удаленный элемент ...
В выходных данных временная дата отображается как та, которую я удалил ... Не уверен, как это возможно, поскольку result=()
ясно показывает, что этот элемент был удален. РЕДАКТИРОВАТЬ : Скрипт для проверки функциональности: PS Хотя я действительно ценю шансы оптимизировать скрипт, пожалуйста, постарайтесь сделать все возможное, чтобы задать вопросы, которые я задаю, а затем оставить отзыв для оптимизации. Спасибо
#!/bin/bash
filedates=(20200420,20200420,20200420,20200419,20200419,20200419,20200416,20200416)
find_oldest_date (){
arr="$1"
echo "Searching for oldest date in directory..."
for file in $arr; do
currentDate=$file
if [ $currentDate -lt $tempOldestDate ]; then
oldestDateFound=$currentDate
else
oldestDateFound=$tempOldestDate
fi
done
oldestDateFoundFormatted=`date -d $oldestDateFound +%Y-%m-%d`
echo "Oldest date found in directory: "$oldestDateFoundFormatted
printf "\n"
}
set_temp_oldest_date (){
arr=$1
echo "Setting temporary oldest date..."
currentOldestDate=($arr[1])
currentOldestDateFormatted=`date -d $currentOldestDate +%Y-%m-%d`
echo "Temporary oldest date: "$currentOldestDateFormatted
printf "\n"
}
find_three_files_with_oldest_date(){
arr=$1
i=0
echo Searching for all three files with date: $oldestDateFoundFormatted ...
for date in $arr; do
currentDate=$date
if [ $currentDate == $oldestDateFound ]; then
((i=i+1))
fi
done
printf "\n"
echo "*****************"
echo "$i file(s) found"
echo "*****************"
printf "\n"
filesMissing=$((3-$i))
if [ $i == 3 ]; then
echo "*****************"
echo All 3 files found
echo "*****************"
else
echo "*****************"
echo "$filesMissing file(s) missing"
echo "*****************"
printf "\n"
echo $(remove_oldest)
printf "\n"
echo $(find_oldest_date)
echo $(find_three_files_with_oldest_date)
fi
}
remove_oldest(){
arr=$1
echo "Removing files with date $oldestDateFound ..."
delete="$oldestDateFound"
result=("${arr[@]}")
echo before: ${arr[@]}
printf "\n"
echo to delete: ${delete[@]}
printf "\n"
for i in $result; do
for host in ${delete[@]}; do
result=( "${result[@]/$host}" )
done
done
echo after: ${result[@]}
printf "\n"
echo Starting new search with updated/filtered list of dates
echo $(set_temp_oldest_date "${result[@]}")
echo $(find_oldest_date "${result[@]}")
echo $(find_three_files_with_oldest_date "${result[@]}")
}
set_temp_oldest_date "${filedates[@]}"
find_oldest_date "${filedates[@]}"
find_three_files_with_oldest_date "${filedates[@]}"