If statement 从sh语法到Makefile语法的条件

If statement 从sh语法到Makefile语法的条件,if-statement,github,makefile,sh,gnu-make,If Statement,Github,Makefile,Sh,Gnu Make,我有一个特定的文件UPDATE.sh。这个文件的任务是使用git merge更新我的程序 UPDATE.sh: #!/usr/bin/env bash git fetch https://xxxxx newUpdatesAvailable=`git diff HEAD FETCH_HEAD` if [[ "$newUpdatesAvailable" != "" ]] then git branch backup git checkout backup

我有一个特定的文件UPDATE.sh。这个文件的任务是使用git merge更新我的程序

UPDATE.sh:

#!/usr/bin/env bash

git fetch https://xxxxx

newUpdatesAvailable=`git diff HEAD FETCH_HEAD`

if [[ "$newUpdatesAvailable" != "" ]]
then
        git branch backup
        git checkout backup
        git add .
        git add -u
        git commit -m date "+%d.%m.%Y"
        git checkout master

        git merge FETCH_HEAD
else
        echo "No updates..."
fi
我必须写同样的东西,但在Make语法上

我试图找出Make中的条件,但对我来说不起作用

请告诉我如何在不使用以下命令的情况下在Makefile中正确写入此命令:

update:
      ./UPDATE.sh

您不需要捕获git diff的输出;你只需要知道是否存在差异。使用
-q
选项

if ! git diff -q HEAD FETCH_HEAD; then
  git branch backup
  ...
else
  echo "No updates"
fi        
-q
抑制输出并暗示
--exit code
,如果存在差异,将导致
git diff
以非零退出状态退出

在Makefile中,这将是

.PHONY: update

update:
        git fetch https://xxxxx
        if ! git diff -q HEAD FETCH_HEAD; then \
          git branch backup && \
          git checkout backup && \
          git add . && \
          git add -u && \
          git commit -m date "+%d.%m.%Y" && \
          git checkout master && \
          git merge FETCH_HEAD; \
        else \
          echo "No updates"; \
        fi

分号和反斜杠是必要的,因为整个
if
语句必须出现在一个逻辑行上。

另一个不需要大量引用、分号等的替代方法是利用这样一个事实,即当退出代码为非零时,make将停止执行规则

这通常会使Makefile更易于维护,规则也更简单

update:
        git fetch https://xxxxx
        git diff -q HEAD FETCH_HEAD || { echo "No Update" ; false ; }
        git branch backup
        git checkout backup
        git add .
        git add -u
        git commit -m date "+%d.%m.%Y"
        git checkout master
        git merge FETCH_HEAD

这回答了你的问题吗?为了可靠性起见,我将添加
.PHONY:update
,以便名为
update
的现有文件不会跳过更新。我还要添加
set-e
if
之前,让shell在第一个不成功的命令时退出,而不是继续进行随机更改。我不建议使用
set-e
,但如果任何命令失败,我会更新答案以缩短命令链。