首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在make目标的if语句中,是否可以将一个变量与多个值进行比较?

在make目标的if语句中,是否可以将一个变量与多个值进行比较?
EN

Stack Overflow用户
提问于 2021-01-07 01:16:02
回答 3查看 51关注 0票数 0

我正在尝试运行make目标,其中在CLI上传递了一个特定值,但是这个值应该与2个或更多可能的值进行比较,比如在cli上传递的值应该等于预先存在的列表中的任何一个,这样条件就变成了真,并且如果块被执行了!

代码语言:javascript
复制
.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块就应该被执行!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-01-07 01:22:18

filter GNU make function是你的朋友:

代码语言:javascript
复制
.PHONY:plan-infra

MATCH := $(filter emr gmr,$(infra_module_path))

plan-infra: configure  ## Plan Infra
    @if [ -n "$(MATCH)" ]; then\
        echo "test";\
    fi

但请注意,如果您传递的值包含几个空格分隔的标记,并且至少有一个匹配,则也会匹配,例如,

代码语言:javascript
复制
make plan-infra -e infra_module_path="emr foo bar"

正如MadScientist所指出的,filter-out更好一些,因为当字符串只包含过滤后的标记时,它会返回空字符串;因此它更准确:

代码语言:javascript
复制
.PHONY:plan-infra

MATCH := $(filter-out emr gmr,$(infra_module_path))

plan-infra: configure  ## Plan Infra
    @if [ -z "$(MATCH)" ]; then\
        echo "test";\
    fi

但它仍然不是100%准确的:

代码语言:javascript
复制
make plan-infra -e infra_module_path="emr qmr"

仍然匹配。如果您确实需要精确匹配,尽管如Charles DuffyMadScientist所指出的,使用make函数(至少在您的例子中)是可行的,但使用外壳结构会更好。以防您绝对需要使用make函数进行精确匹配:

代码语言:javascript
复制
.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
票数 0
EN

Stack Overflow用户

发布于 2021-01-07 02:33:41

您可以使用shell (-o)条件,或使用case语句检查两个可能的值之一。case语句更容易理解一些。

使用if:

代码语言:javascript
复制
.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

使用案例:

代码语言:javascript
复制
.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
票数 0
EN

Stack Overflow用户

发布于 2021-01-07 03:22:34

我可能建议使用make条件句,而不是bash条件句。您可能需要执行以下操作:

代码语言:javascript
复制
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

(请注意,ifeqelseendif前面有空格,而不是制表符--您实际上并不需要这些空格,但它们对于可读性很有用)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65600297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档