我需要将shell if else语句添加到我的Makefile中,但if表达式的计算结果始终为false
。例如下一个代码:
if [1 -eq 1]; then echo "yes"; else echo "no"
打印";CCD_ 2";
唯一评估为true
的代码是:
if true; then echo "yes"; else echo "no"
为什么代码中的所有表达式("true"除外(的计算结果都为false
?:(我真的很感谢的任何帮助
**请注意-当从Shell 运行时,语句工作正常
原始Makefile的代码片段:
SIMULATION_RUN_CMD = rm -rf $(TEST_DIR)/* && mkdir -p $(TEST_DIR) && cd $(TEST_DIR) && (cp -rf $(VIVADO_PROJ)/$(PROJECT)/export_for_sim/$(SIMULATOR)/{*.mem,.mif,design.dat,nocattrs.dat,cpm_data_sim.cdo} $(TEST_DIR) || true) &&
ln -sf $(TEST_DIR)/simulation.log $(RUN_DIR)/simulation.log &&
(timeout $(SIM_TIMEOUT) ${SIM_DIR}/simv +UVM_TESTNAME=$(UVM_TESTNAME) $(SIM_FLAGS) -l $(TEST_DIR)/simulation.log -do $(DO_FILE) ;
if [1 -eq 1]; then echo "if statement yes " >> $(TEST_DIR)/simulation.log; else echo "if statement no " >> $(TEST_DIR)/simulation.log; fi
|| true) &&
$(MODEL_POST_SIM_ACIONS)
$(SIMULATION_RUN_TAR):
@echo -e "Make Command: $(SIMULATION_RUN_CMD)" $(PRINT_OUTPUT)
($(SIMULATION_RUN_CMD)) $(PRINT_OUTPUT)
首先,您的命令中存在语法错误。如果你把它准确地输入到bash中,你会得到一个错误:
[[1: command not found
在[[
之后和]]
令牌之前需要空格:
if [[ 1 -eq 1 ]]; then echo "yes"; else echo "no"
其次,从make运行时它不起作用的原因是make没有调用bash。Make调用POSIX标准shell/bin/sh
。如果你这样做,你会看到与make相同的行为:
$ /bin/sh -c 'if [[ 1 -eq 1 ]]; then echo yes; else echo no; fi'
/bin/sh: 1: [[: not found
no
[[
运算符是bash特有的特性。如果你想使用POSIX功能来写这篇文章,你应该使用:
$ /bin/sh -c 'if [ 1 -eq 1 ]; then echo yes; else echo no; fi'
yes
如果您真的想让make调用bash作为shell而不是sh
,请将其添加到您的makefile中:
SHELL := /bin/bash
当然,您的makefile在任何没有/bin/bash
可用的系统上都无法工作。
ETA
在看到你添加的非常复杂但仍然不完整的代码后,我会说以下内容:
正如我上面所说的,您的脚本中有一个错误。if [1 -eq 1]
是完全非法的。必须在[
之后和]
之前有空格。同样,如果您自己在shell提示下运行此操作,您将得到相同的失败。这与制造无关。
由于这个错误,if语句将始终失败,因此这将始终运行";否则";命令和打印";否";。
您说您没有看到任何错误消息。我无法解释,除非你用这种方式运行这个配方:
($(SIMULATION_RUN_CMD)) $(PRINT_OUTPUT)
您没有告诉usePRINT_OUTPUT
变量的值是什么,所以我只能假设它将stderr丢弃到位桶中(或者可能是stdout和stderr(。如果您不这样做,以便可以看到输出,那么您将看到正在打印的错误消息。或者可能会重定向到日志文件,在这种情况下,您可以在那里查找消息。