Уважаемые есть необходимость написать bash скрипт одним из элементов которого будет сканирование каталога и вывод определённых имён файлов (без расширения) ка элементов массива.
Планирую использовать утилиту basename.
basename -s .sh Каталог/*.sh
ls Каталог
1.sh 2.sh 3.gr 4.sh
1
2
4
По факту это строка 1\n2\n4, но её нужно преобразовать в массив вида
imyaMassiva=(1 2 4)
Чем можно это сделать в рамках bach без установки экзотических утилит?
printf же есть, скриптом вывод basename направить в переменную, что-то с ней сделать и printf`ом вывести.... ну наверное, может всё это и sed`ом делается, но в нём не силён.
Благодарю, случайно сам разобрался.
Если сделать вот так:
basename -s .sh Каталог/*.sh | sed -e ':a' -e '$!N' -e '$!ba' -e 's/\n/ /g'
Лирическое отступление:
Параметры для
sed нашел в интернете ,что выполняют операторы я толком не понял,
man по команде весьма куцый и народ в интернете тоже даёт немного разные трактовки.
Вот например одна:
- a: Добавляет задачи
- b: разветвляет содержимое файла
- N: переход на следующую строку.
- $!: предотвращает применение замены в последней строке.
А вот другая
(https://askubuntu.com/questions/461191/what-is-the-meaning-of-an-in-a-sed-command)
В целом они похожи, но однозначного понимания не вносят. Если кто-то знает точнее, пожалуйста поясните.
sed в данном случае заменяет
\n на то что указано вторым аргументом в параметре
s, в моём случае "пробел". А значит вывод получается вот таким:
1 2 4
И если его вставить в массив то
bash поймёт его как элементы массива. Скрипт в итоге получается таким:
#Создаём переменную
name=$(basename -s .sh Каталог/*.sh | sed -e ':a' -e '$!N' -e '$!ba' -e 's/\n/ /g')
#Добавляем переменную в массив
imyaMassiva=($name)