Ошибка в моем makefile при использовании seq в цикле for

У меня есть следующий Makefile:

MYVAR = 10

target:
    for i in $(seq 0 $MYVAR)
    do
        echo "test" . $i
    done

В основном то, что я хочу получить, это ...

test 1
test 2
...
test n

Когда я пытаюсь запустить его, я получаю:

для меня в синтаксическая ошибка: неожиданный конец файла

Какая для этого правильная магия?

make заменяет все без исключения $(...), с которыми он встречается в файле с содержимым переменной или пустой строкой, если переменная не определена, поэтому ваш $(seq выглядит как неопределенная переменная, которую нужно создать, и, таким образом, она незаметно съедается. Вам нужна escape-последовательность $$, которая делает замену только одним $, который выводится в процесс оболочки, то есть $$(seq. Более того, сделайте так, чтобы все отдельные строки помещались в отдельные процессы оболочки, поэтому вам нужно продолжить строки с помощью символа `\` в конце, чтобы одна оболочка могла видеть весь цикл целиком.
Vroomfondel 13.09.2018 21:28
0
1
120
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Правильный синтаксис:

MYVAR = 10

target:
    for i in $$(seq 0 $(MYVAR)); \
    do \
        echo "test" . $$i; \
    done

который работает как:

$ make
for i in $(seq 0 10); \
do \
    echo "test" . $i; \
done
test . 0
test . 1
test . 2
test . 3
test . 4
test . 5
test . 6
test . 7
test . 8
test . 9
test . 10

(Я не уверен, что вы имеете в виду под . в команде echo, если это не опечатка).

В основном обратите внимание, что в команде оболочки в рецепте любой $..., который вы должны быть расширены оболочкой, должны быть экранированы как $$..., чтобы не расширяется самим make.

Другие вопросы по теме