18

(编辑:基于@Michael反馈的问题更准确)

在 bash 中,我经常使用参数扩展:以下命令在未设置default value时打印“” $VARNAME,否则打印 VARNAME 内容。

echo ${VARNAME:-default value}  #if VARNAME empty => print "default value" 
echo ${VARNAME-default value}   #if VARNAME empty => print "" (VARNAME string)

没有在 GNU 上找到类似的功能make。我终于在我的Makefile

VARNAME ?= "default value"
all:
        echo ${VARNAME}

但我对这个解决方案不满意:它总是创建变量VARNAME,这可能会改变某些 makefile 的行为。

有没有更简单的方法来获取未设置变量的默认值?

4

4 回答 4

28

如果你想使用 GNU make 变量的扩展,如果它是非空的,如果它是空的,则使用默认值,但不设置变量,你可以这样做:

all:
        echo $(or $(VARNAME),default value)
于 2013-04-16T12:31:46.883 回答
1

如果要测试变量是否具有非空值,可以使用:

ifeq ($(VARNAME),)
        VARNAME="default value"
else
        do_something_else
endif

要检查变量是否已定义,请使用ifdef.

有关更多信息,请参阅手册中的条件句法。

于 2013-04-16T11:25:51.423 回答
0

我有一个类似的情况,过滤 shell 命令的结果可能是单个单词或空字符串。当为空时,它应该回退到默认单词。在下面的示例中,APPLE_LINUX 在 macOS 上将是“apple”,在其他平台上将是“linux”。MSG 将设置为适合平台的消息。示例意图避免使用ifeq.

MACHINE         := $(shell $(COMPILE.cpp) -dumpmachine)
MACHINE_APPLE   := $(findstring apple,$(MACHINE))
APPLE_LINUX     := $(firstword $(MACHINE_APPLE) linux)
apple.MSG       := You are building on macOS
linux.MSG       := You are building on Linux or another OS
MSG             := $($(APPLE_LINUX).MSG)
于 2020-05-25T19:19:50.827 回答
-1

只需删除冒号。如果您:-在替换中使用默认值,则如果变量为空、空字符串或不存在,则将使用默认值,但仅-在未定义变量的情况下单独使用将仅替换默认值。

# var1=default
# var2=

# echo var2 is ${var2:-$var1}
var2 is something
# echo var3 is ${var3:-$var1}
var3 is something

# echo var2 is ${var2-$var1}
var2 is
# echo var3 is ${var3-$var1}
var3 is something
于 2013-04-16T11:28:16.560 回答