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
双引号是变量值的一部分,但是由于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实际运行的内容通常会为您提供帮助。
这是一个应该可用的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)
,尽管会被警告,但这样会使速度变慢。您也可以尝试将值输出到文件而不是变量,并在需要引用该文件时使用该文件(尽管在这两种情况下,都需要注意很多竞争条件)。