У меня есть следующий код внутри файла make
, который получается из массива команд строк
apps := $(shell fxt run apps)
go:
@for v in $(apps) ; do \
echo inside recipe loop with sh command: $$v ; \
done
Команда возвращает массив типа [app1 app2 appN]
(внутри может быть много приложений)
Но мне нужно, чтобы это был app1 app2 appN
, есть идеи, как удалить массив []
?
когда я бегу сделаю, я получил следующее
inside recipe loop with sh command: [app
inside recipe loop with sh command: app2]
Вы просто можете использовать команду subst
с пустой заменяющей частью, чтобы удалить части вашего переменного содержимого, например:
apps := $(shell ls)
#add []
apps := [ $(apps) ]
$(info Apps: $(apps))
# replace [ with nothing -> remove it
apps := $(subst [ ,,$(apps))
# replace ] with nothing -> remove it
apps := $(subst ],,$(apps))
$(info Apps: $(apps))
или используя filer-out
с:
apps :=$(filter-out [ ], $(apps))
Вместо двух функций замены. Важно: держите space
между скобками, так как для filter-out
нужен список слов. Итак, у вас есть 2 слова в шаблонной части команды.
Выход:
Apps: [ a b c Makefile ]
Apps: a b c Makefile
Если во входных данных нет пробела между [
и первым словом, вы должны использовать команду subst
.
Возможно, вам нравится объединить оба выражения в одно (но менее читаемое):
apps := $(subst ],,$(subst [,,$(apps)))
поздравление за 10к :)
@JennyM: Спасибо за необходимые голоса;). Я добавил к своему ответу однострочник.
Большое спасибо :), проблема в том, что у меня его нет, как [ app1 app2 ]
, у меня он как [app1 app2]
, нет возможности использовать его так? сейчас фильтр не работает ...
@JennyM: Тогда вам нужно использовать команду subst
с двумя строками. Я не вижу шанса поместить это в одну строчку. Хорошо, вы можете объединить оба с: apps := $(subst ],,$(subst [,,$(apps)))
У меня есть дополнительный вопрос, который как-то связан, открою новый?
@JennyM: Не знаю вопроса :-) Дайте ему шанс!
спасибо, может быть в одну строчку? вместо двух подмножеств?