Если ваш собеседник активно пробуждает в вас жалость, страх, жадность или похоть,
существует большая вероятность, что он пытается вас развести.

Меню навигации для мобильных

Есть ли возможность вывод basename добавить как элементы массива?

Автор Shaman, 03 Нояб., 2023, 17:51

« предыдущая - следующая »

Shaman

Уважаемые есть необходимость написать 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 без установки экзотических утилит?

zenon

printf же есть, скриптом вывод basename направить в переменную, что-то с ней сделать и printf`ом вывести.... ну наверное, может всё это и sed`ом делается, но в нём не силён.
https://github.com/minamonra/

Shaman

Благодарю, случайно сам разобрался.
Если сделать вот так:
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)