ifeq不比较两个变量

问题描述 投票:0回答:2

ifeq不比较两个变量

我正在编写一个程序,将文件移至桌面,而与操作系统中选择的语言无关。在葡萄牙语中,桌面文件夹称为“Áreade trabalho”。由于“Áreade Trabalho”是三个单独的单词,因此在编写目录时需要添加单引号(“Áreade Trabalho”),否则该命令将导致错误。

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

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

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

    xdg-user-dir DESKTOP

并且如果目录等于主目录加上“ /Áreade 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
ubuntu makefile
2个回答
0
投票

双引号是变量值的一部分,但是由于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实际运行的内容通常会为您提供帮助。


0
投票

这是一个应该可用的makefile

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


# 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

ifeq ("${desktop}","${desktopVar}")
desktop=${HOME}/'Área de Trabalho'
endif

如果仅在运行配方后才需要更新变量,则情况会变得更加复杂-在该配方行结束时,忘记在一个配方行中设置的任何bash变量。因此,不能在后续行或其他目标的配方中使用它。如果您只想在一个目标中使用变量,则可以将bash行连接在一起。如果您想将其用于其他食谱,则可以调用$(eval VAR:=blah),尽管会被警告,但这样会使速度变慢。您也可以尝试将值输出到文件而不是变量,并在需要引用该文件时使用该文件(尽管在这两种情况下,都需要注意很多竞争条件)。

© www.soinside.com 2019 - 2024. All rights reserved.