Измените следующую строку:
grepFails=$(egrep "\\def$myVar\>" myFile)
На:
grepFails=$(egrep "\\\\def\\$myVar\>" myFile)
Проблема заключалась в том, что вы неправильно экранировали \
в подоболочке.
Чтобы понять, попробуйте запустить eval echo "\\\\"
. Вы заметите, что результат будет \
из-за двойной оценки.
Вам нужно сначала сохранить значение в переменной оболочки:
MINOR_VERSION := $(shell v='$(FULL_VERSION)'; echo "$${v%.*}")
(при условии, что $(FULL_VERSION)
не содержит одинарных кавычек)
Теперь это вызывает sh
, а не bash
. ${var%pattern}
является стандартным sh
оператором (происходит отksh
).
Если вы хотите использоватьbash
-конкретных операторов, вам нужно указать make
, чтобы он звонил bash
вместо sh
с помощью
SHELL = bash
Однако имейте в виду, что на многих системах bash
не установлено по умолчанию, что сделало бы ваш Makefile не -переносимым (, но с другой стороны, на некоторых системах также нет GNU make
, и вы уже используя там некоторые GNU-измы )).
Вы можете сделать это с помощью встроенных функций (при условии, что вы используете GNU make):
VER=1.2.3
MINORVERTMP=$(subst.,,${VER})
MINORVER=$(word 1,${MINORVERTMP}).$(word 2,${MINORVERTMP})
all:
@echo ${MINORVER}
Если вы можете использоватьbmake
(BSD make ), у вас может быть больше (и, возможно, более простые )возможности:
VER=1.2.3
all: test1 test2
test1:
# simple regular expression-based replace like sed
@echo $@: ${VER:C,([^\.]*)\.([^\.]*).*,\1.\2,}
test2:
# replace all dot to spaces (S),
# print first and second element (:[1..2])
# with dot separator (ts.)
@echo $@: ${VER:S,.,,g:[1..2]:ts.}