Умён не тот, кто много знает, а тот, кто умеет анализировать.

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

Есть ли возможность вывод 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)