Идея для написания этой заметки возникла при решении практической задачи: необходимо обработать определённым образом большое количество директорий, различного уровня вложенности, содержащих файлы определённого типа, на сервере, работающем под управлением операционной системы Fedora Server без графического оконного менеджера. В этих условиях наиболее удобным решением является написание сценария на языке Bash.
При проектировании сценария я решил, что прежде всего, он должен создать массив, состоящий из уникальных имён директорий, содержащих файлы заданного типа, а уже потом проводить требуемые манипуляции с этими директориями, беря их имена из массива.
Так как эта часть, написанного мною сценария, является универсальной и демонстрирует возможность считывания имён объектов файловой системы в массив, что вызывает частые вопросы у начинающих знакомство с разработкой собственных сценариев на языке Bash, я решил поделиться фрагментом своего кода, дополнив его необходимыми для понимания комментариями.
#массив, содержащий имена директорий
declare -a dirs
#переменная, содержащая корневую директорию для начала поиска
declare -r src="/home/username/src"
#переменная, содержащая маску для поиска файлов
declare -r mask="*.cue"
#функция для проверки вхождения значения в массив: 0 - да, 1 - нет
elementIn () {
local e
for e in "${@:2}"; do [[ "$e" == "$1" ]] && return 0; done
return 1
}
while read file; do
#получение директории из имени файла
directory="$(dirname "$file")"
#вызов функции elementIn
elementIn "$directory" "${dirs[@]}"
#проверка значения, возвращённого функций elementIn, добавление значения в массив
[[ $? -eq 1 ]] && dirs+=( "$directory" )
done < <(find "$src" -name "$mask" -type f)
#пример дальнейшей работы с массивом dirs
for directory in "${dirs[@]}"; do
echo "$directory"
done
Взяв за основу приведённый код, вы можете понять, как работать с массивами в Bash, добавлять в сценарии собственные функции и получать значения, возвращаемые ими. Это позволит расширить перечень повседневных и профессиональных задач, решаемых с использованием сценариев Bash.