以下是让我的makefile中的代码工作的最终结果 第5行是问题区域
BASE=50
INCREMENT=1
FORMATTED_NUMBER=${BASE}+${INCREMENT}
all:
echo $$((${FORMATTED_NUMBER}))
为什么我要添加两个$和两个(())?
Formatted_Number如果我回显它看起来像" 50 + 1" 。知道看到$$((" 50 + 1"))实际上是51的逻辑是什么?
抱歉,如果这是一个基本问题,我是新手,并且不完全理解它。
答案 0 :(得分:3)
首先,每当提出问题时,请提供完整的示例。你错过了目标和先决条件,所以这不是一个有效的makefile,并且根据它们的位置,它可能意味着非常不同的东西。我假设你的makefile是这样的:
BASE=50
INCREMENT=1
FORMATTED_NUMBER=${BASE}+${INCREMENT}
all:
echo $$((${FORMATTED_NUMBER}))
Makefile很有趣,因为它们是两种不同格式的组合。主格式是makefile格式(上面的前五行),但是在make配方行中(这是上面的最后一行,用TAB字符缩进)是shell脚本格式。
Make对数学一无所知。它不解释+
值中的FORMATTED_NUMBER
。 Make变量都是字符串。如果你想做数学,你必须在shell中,在shell脚本中,使用shell的数学工具。
在bash和其他现代shell中,语法$(( ...expression... ))
将执行数学运算。所以在shell中如果你输入echo $((50+1))
(继续自己试一试),它会打印51
。
这就是为什么你需要双括号((...))
:因为这就是shell想要的,你正在编写一个shell脚本。
为什么双$
?因为之前 make启动shell来运行你的配方,它首先用它们的值替换所有make变量引用。这就是shell在这里看到50+1
的原因:在启动shell之前,它将${FORMATTED_NUMBER}
扩展为其值${BASE}+${INCREMENT}
,然后它扩展了那些变量,以便它以50+1
结束。
但是,如果您真的想在shell脚本中使用$
(就像在这里一样),该怎么办?然后你必须告诉make不要将$
视为引入make变量。你通过加倍来实现这一点,所以如果make看到$$
那么不认为它是一个make变量,并向shell发送一个$
。
因此,对于配方行echo $$((${FORMATTED_NUMBER}))
,make实际上会调用一个shell脚本echo $((50+1))
。
答案 1 :(得分:0)
你可以在BASH中使用它:
FORMATTED_NUMBER=$((BASE+INCREMENT))
使用非BASH使用:
FORMATTED_NUMBER=`echo "$BASE + $INCREMENT" | bc`