linux - 如何在 if 语句等条件下编写命令?

标签 linux makefile

我想将命令编写为 if 的条件语句,即当命令执行时没有任何错误,它应该打印成功,如果失败则打印失败。 我什至试图阻止打印命令的长控制台消息。 下面是我正在使用的代码,它在没有任何条件语句(如打印成功或失败消息)的情况下工作得很好。

$(BASENAME).pdf: $(BASENAME).ps
    ps2pdf $(BASENAME).ps $(BASENAME).pdf  

$(BASENAME).ps: $(BASENAME).dvi
    dvips -Ppdf $(BASENAME).dvi -o $(BASENAME).ps

我试着把上面的改成

$(BASENAME).pdf: $(BASENAME).ps
    @out=ps2pdf $(BASENAME).ps $(BASENAME).pdf > /dev/null 2>&1 && echo "    5. ps2pdf successful" || echo "    5. ps2pdf failed"

$(BASENAME).ps: $(BASENAME).dvi

    dvips -Ppdf $(BASENAME).dvi -o $(BASENAME).ps  > /dev/null 2>&1\
    if [ $? -eq 0 ];\
            then \
            echo "    4. dvips successful";\
    else \
            echo "    4. dvips failed";\
            exit 2;\
    fi

我的执行失败并在运行如下错误代码时向我提供错误

dvips -Ppdf basename_04.dvi -o basename_04.ps \
if [ basename_04.dvi -eq 0 ];\
        then \
        echo "    4. dvips successful";\
else \
        echo "    4. dvips failed";\
        exit 2;\
fi
/bin/sh: -c: line 2: syntax error near unexpected token `then'
/bin/sh: -c: line 2: `      then \'
make: *** [basename_04.ps] Error 1

即使在使用分号更新后,我仍然遇到以下错误。

dvips -Ppdf nkukunur_04.dvi -o nkukunur_04.ps  > /dev/null 2>&1 ;\
      if [ nkukunur_04.dvi -eq 0 ]; \
              then \
              echo "    4. dvips successful"; \
      else \
              echo "    4. dvips failed"; \
              exit 2; \
      fi
/bin/sh: line 1: [: nkukunur_04.dvi: integer expression expected
    4. dvips failed

请帮我解决这个问题。

最佳答案

你少了一个分号——和一个双倍的美元:

$(BASENAME).ps: $(BASENAME).dvi
    dvips -Ppdf $(BASENAME).dvi -o $(BASENAME).ps; \
    if [ $$? -eq 0 ]; \
            then \
            echo "    4. dvips successful"; \
    else \
            echo "    4. dvips failed"; \
            exit 2; \
    fi

缺少的分号是第一个命令行末尾的分号(在 $(BASENAME).ps 之后和反斜杠之前)。假设 make 将反斜杠换行符替换为空白(不是换行符)。这就是测试后需要分号的原因;这就是为什么您在 if 之前也需要一个。

需要双美元,因为 $? 是一个 Make 宏,但您希望 shell 看到并解释 $?。因此,您可以使用 $$ 将其从 Make 中隐藏起来,这是一个扩展为 $ 的宏调用。

关于linux - 如何在 if 语句等条件下编写命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47881505/

相关文章:

C 生成文件不工作

linux - 测量两个精确站点之间的速度

Linux 发送邮件 - 命令行

centos - 找不到 Ocamlfind 命令

android - 如何在使用 Robolectric 时计算测试覆盖率

unix - cmake命令行的含义是什么

在 Linux 上使用 chromedriver 和 chrome 时出现 java.lang.ExceptionInInitializerError

c - 在linux内核中映射io设备地址?

regex - Bash 引用行为和 sed

makefile - @: (at symbol colon) mean in a Makefile? 是什么