这个逃脱的工作原理是什么?

时间:2014-04-08 18:55:00

标签: shell makefile addition

以下是让我的makefile中的代码工作的最终结果 第5行是问题区域

BASE=50
INCREMENT=1
FORMATTED_NUMBER=${BASE}+${INCREMENT}

all:
        echo $$((${FORMATTED_NUMBER}))

为什么我要添加两个$和两个(())?

Formatted_Number如果我回显它看起来像" 50 + 1" 。知道看到$$((" 50 + 1"))实际上是51的逻辑是什么?

抱歉,如果这是一个基本问题,我是新手,并且不完全理解它。

2 个答案:

答案 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`