Использование $(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)))