Можно ли улучшить мой Bash-скрипт?

Как я могу улучшить данный скрипт, который предназначен для обработки каждого элемента массива, содержащего файлы из указанной директории, и проверить, является ли каждый элемент файлом и доступен ли он для чтения, и в случае отрицательного результата, удалить его из массива? Вот нерабочий сценарий, который я попытался использовать: 

```bash
#!/usr/bin/env bash
main() {
    clear
    files=(*)
    for file in "${files[@]}"
    do
        if [[ -d "${file}" ]] || [[ ! -r "${file}" ]]
        then
            unset files["$file"]
        fi
    done
} 
main
```
  • 4 февраля 2024 г. 18:18
Ответы на вопрос 2
Ваш код имеет несколько недостатков:

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[@]}")`.

Теперь скрипт обходит элементы массива точно и корректно удаляет ненужные элементы.
main()
{
   files=()
   for file in *; do
      [ -r $file ] && files+=($file)
   done
   echo ${files[@]}
}
main
Похожие вопросы