Как правильно написать для l oop в Makefile - PullRequest
0 голосов
/ 13 января 2020

Я просмотрел несколько постов, но так и не понял, как это работает.

Мой запрос:

for i in *.json
do
  file = `echo $i |cut -d _ -f2`
  echo ${file}
  # do the rest tasks
done

Как преобразовать вышеуказанный скрипт в целевой файл Makefile?

Вот что я пробовал

foo: 
    for i in *.json; do      \
       $(eval FILE = $(shell echo $$i |cut -d _ -f2));    \
       echo $(FILE) ;\
    done

Но это не работает

1 Ответ

1 голос
/ 13 января 2020

Использование $(eval) или $(shell) - это ... даже неправильно.

foo: 
    for i in *.json; do \
       file=$$(echo "$$i" |cut -d _ -f2); \
       echo "$$file"; \
    done

Обратите внимание на кавычки переменных имени файла и отсутствие пробелов вокруг оператора присваивания =, и удвоение любого знака доллара, чтобы передать его из make в оболочку.

Однако оболочка обеспечивает гораздо лучший механизм для этого;

foo:
    for i in *.json; do \
        j=$${i#*_}; \
        echo "$${j%%_*}"; \
    done

или, возможно,

foo:
    printf '%s\n' *.json \
    | sed 's/[^_]*_\([^_]*\)_.*/\1/'

Если вы ожидаете только одно подчеркивание, то оба они могут быть дополнительно упрощены.

Или, возможно, вы просто ищете

makefile_variable := $(foreach x,$(wildcard *.json),$(word 2,$(subst _, ,$x)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...