Ваш код имеет несколько недостатков:
1. Когда вы используете `unset`, вы должны использовать индекс массива, а не его значение.
2. Скрипт не учитывает возможности перехода по индексам массива, если некоторые элементы будут удалены в процессе итерации.
3. Если список файлов включает в себя элементы с пробелами или специальные символы, `unset` может не работать должным образом с текущим использованием.
Используйте следующую логику:
```bash
#!/usr/bin/env bash
main() {
clear
files=(*)
for i in "${!files[@]}"; do
file=${files[$i]}
if [[ -d "$file" ]] || [[ ! -r "$file" ]]; then
unset 'files[i]'
fi
done
# Для переиндексации массива (если это необходимо) используйте
files=("${files[@]}")
# Продолжайте с обработкой оставшихся файлов...
}
main
```
Изменения:
- Вместо `"${files[@]}"` используется `"${!files[@]}"` для прохода по индексам массива, а не по его значениям.
- При использовании `unset` мы обращаемся к конкретному индексу массива `'files[i]'` (с кавычками, чтобы избежать проблем с интерпретацией).
- После удаления элементов массиве, чтобы “сжать” его индексы и удалить все “пустые” места, используется `files=("${files[@]}")`.
Теперь скрипт обходит элементы массива точно и корректно удаляет ненужные элементы.