我正在尝试运行make目标,其中在CLI上传递了一个特定值,但是这个值应该与2个或更多可能的值进行比较,比如在cli上传递的值应该等于预先存在的列表中的任何一个,这样条件就变成了真,并且如果块被执行了!
.PHONY:plan-infra
plan-infra: configure ## Plan Infra
@if [ "${infra_module_path}" = "emr" or "gmr" ]; then\
echo "test";\
fi
$ make plan-infra -e infra_module_path=emr因此,如果变量"infra_module_path“是"emr”或"gmr“,那么if块就应该被执行!
发布于 2021-01-07 01:22:18
filter GNU make function是你的朋友:
.PHONY:plan-infra
MATCH := $(filter emr gmr,$(infra_module_path))
plan-infra: configure ## Plan Infra
@if [ -n "$(MATCH)" ]; then\
echo "test";\
fi但请注意,如果您传递的值包含几个空格分隔的标记,并且至少有一个匹配,则也会匹配,例如,
make plan-infra -e infra_module_path="emr foo bar"正如MadScientist所指出的,filter-out更好一些,因为当字符串只包含过滤后的标记时,它会返回空字符串;因此它更准确:
.PHONY:plan-infra
MATCH := $(filter-out emr gmr,$(infra_module_path))
plan-infra: configure ## Plan Infra
@if [ -z "$(MATCH)" ]; then\
echo "test";\
fi但它仍然不是100%准确的:
make plan-infra -e infra_module_path="emr qmr"仍然匹配。如果您确实需要精确匹配,尽管如Charles Duffy和MadScientist所指出的,使用make函数(至少在您的例子中)是可行的,但使用外壳结构会更好。以防您绝对需要使用make函数进行精确匹配:
.PHONY:plan-infra
ifeq ($(words $(infra_module_path)),1)
MATCH := $(filter-out emr gmr,$(infra_module_path))
else
MATCH := no
endif
plan-infra: configure ## Plan Infra
@if [ -z "$(MATCH)" ]; then\
echo "test";\
fi发布于 2021-01-07 02:33:41
您可以使用shell (-o)条件,或使用case语句检查两个可能的值之一。case语句更容易理解一些。
使用if:
.PHONY:plan-infra
plan-infra: configure ## Plan Infra
@if [ "${infra_module_path}" = "emr" -o "${infra_module_path}" = "gmr" ]; then\
echo "test";\
fi
$ make plan-infra -e infra_module_path=emr使用案例:
.PHONY:plan-infra
plan-infra: configure ## Plan Infra
@case "${infra_module_path"}" in emr | gmr) echo "test";; esac
$ make plan-infra -e infra_module_path=emr发布于 2021-01-07 03:22:34
我可能建议使用make条件句,而不是bash条件句。您可能需要执行以下操作:
plan-infra: configure ## Plan Infr
ifeq ($(filter-out emr gmr,$(infra_module_path)),)
@echo "in emr or gmr";
else
@echo "not in emr or gmr"
endif(请注意,ifeq、else和endif前面有空格,而不是制表符--您实际上并不需要这些空格,但它们对于可读性很有用)
https://stackoverflow.com/questions/65600297
复制相似问题