【问题标题】:ifeq doesn't compare two variableifeq 不比较两个变量
【发布时间】:2020-01-20 18:01:44
【问题描述】:

ifeq 不比较两个变量

我正在制作一个程序来将文件移动到桌面,与操作系统中选择的语言无关。在葡萄牙语中,桌面文件夹称为“Área de trabalho”。由于“Área de Trabalho”是三个分开的单词,所以在写目录的时候需要加上单引号('Área de Trabalho'),否则命令会出错。

    mv Minesweeper $HOME/Área de Trabalho/  #command

    mv: target 'Trabalho/' is not a directory  #Error

我正在使用这个命令来获取用户的桌面文件夹的目录:

    xdg-user-dir DESKTOP

如果目录等于主目录加上“/Área de Trabalho”,我想改变

代码如下:

    desktop=$(shell xdg-user-dir DESKTOP) # I'm using this command to get the directory of the desktop folder of the user
    desktopVar="$$HOME/Área de Trabalho" # And if the directory is equals to the home directory plus "/Área de Trabalho"

    move:
    ifeq (${desktop},${desktopVar})
        desktop=${HOME}/'Área de Trabalho' # I want to change the directory to ${HOME} plus "/'Área de Trabalho'", so the command doesn't results in error
        @echo yes
    endif
        @echo ${desktopVar}
        @echo ${desktop}

但是 ifeq 表示两个变量是相等的并且不会改变任何东西。

这是输出:

    /home/daniel/Área de Trabalho
    /home/daniel/Área de Trabalho

【问题讨论】:

  • 规则 1:永远不要在你的配方行中添加 @,直到你的整个 makefile 完全工作(甚至可能不是这样)。规则 2:永远不要使用配方或 shell 来打印 make 变量,因为 shell 会解释内容并可能在打印结果之前更改结果。始终使用 make 的 $(info ...) 函数,这样您就可以准确地看到 make 看到的内容。

标签: ubuntu makefile


【解决方案1】:

这是一个应该可以工作的makefile(不,这次是真的:-)我实际测试过这个:)

desktop:=$(shell xdg-user-dir DESKTOP)
desktopVar:=${HOME}/Área de Trabalho  #note: using _MAKE_ variable ${HOME} here

$(info desktop:     [${desktop}])
$(info desktopVar:  [${desktopVar}])

    # note: using double quotes around ifeq arguments -- not required
    #       here, but it's good practice:
    # also note: this is not inside of a recipe, so it's done by the
    #            makefile at parse time

ifneq ("${desktop}","${desktopVar}")
$(info changing desktop)
desktop:=${HOME}/Área de Trabalho
endif


$(info desktop:     [${desktop}])
$(info desktopVar:  [${desktopVar}])

all:
        @echo running $@

哪个输出:

scripts> make -f test.mk
desktop:     [/users/foo/Desktop]
desktopVar:  [/users/foo/Área de Trabalho  ]
changing desktop
desktop:     [/users/foo/Área de Trabalho]
desktopVar:  [/users/foo/Área de Trabalho  ]
running all

【讨论】:

  • 我尝试了这个 makefile,但它没有工作:(我注意到这一行末尾的 { ") }:desktopVar=${HOME}/Área de Trabalho") 我也尝试删除它并且还在另一边写它并且makefile仍然无法正常工作:(
  • 糟糕,剪切并粘贴。你是不是拆了支架?我将在其中添加一些调试代码可能会有所帮助。
  • 我刚刚跑了上面的。 ifeq 也应该是 ifneq。在上面的示例中,我切换到使用:=,但这对您的情况没有影响
【解决方案2】:

双引号是变量值的一部分,但它们不会显示在输出中,因为 shell 会解释它们。

desktop = a
desktopVar = "a"

test:
ifeq ($(desktop),$(desktopVar))
    @echo yes
else
    @echo no
endif
    echo $(desktop)
    echo $(desktopVar)

因此,解决方案是在定义中包含双引号:

desktop = "$(shell xdg-user-dir DESKTOP)"

不要过度使用@,查看 Makefile 实际尝试运行的内容通常可以在调试时帮助您。

【讨论】:

  • 我把你说的双引号括起来,还删除了最后两个@。这是新的输出:´ echo "$HOME/Área de Trabalho"´ ´ /home/daniel/Área de Trabalho´ ´ echo "/home/daniel/Área de Trabalho"´ ´ /home/daniel/Área de Trabalho´
  • 是的,双美元符号引起了您的问题。就make而言,一个变量包含$HOME/Area de Trabalho,另一个包含/home/daniel/Area de Trabalho,它们是不同的字符串。当 make 将 $HOME 字符串传递给 bash 时,bash$HOME 扩展为 home/daniel,因此打印结果是相同的。 (但是 ifdef 在 make 中,扩展还没有发生......)
  • 此外,在配方中分配变量desktop 并不会像您认为的那样做——它为该特定配方行设置了一个 bash 变量。它不会影响 make 变量。一旦配方行终止,它也会被遗忘......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-05
  • 2019-09-29
  • 2015-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多