如何在 makefile 函数内部使用时替换 tcsh 脚本中变量中的字符

How to replace a character in a variable in tcsh script while using inside a makefile function

我有一个包含以下内容的 makefile :

mytarget:
    @$(call my_func, echo \"hello world\")

define my_func
    $(eval var := $(1))

    if [[ "$(var)" != "" ]]; then \
        $(var); \
    fi;
endef 

在使用 make 命令执行时,打印出“hello world”(用双引号引起来) 我想要的只是在条件 if 检查之前从回显“hello world”中删除“。

我尝试使用以下语句但没有用:

var2 = $(echo $var | tr '"' '' 然后在 if 条件中使用 $(var2) 而不是 $(var) 它不工作。 非常感谢任何帮助。

谢谢

首先,在它们 100% 工作之前,您永远不应该将 @ 添加到您的 makefile 配方中。否则你就是在蒙着眼睛调试你的 makefile。

您的整个 makefile 脚本似乎可以写成:

mytarget:
        $(call my_func, echo "hello world")

my_func = 

并且它的工作方式完全相同:如果使用空参数调用 my_func,则 </code> 扩展为空字符串,这正是您要测试的内容。大概您出于某种原因想要更复杂的配置,但是正如我在评论中提到的那样,这似乎是一个 XY 问题。</p> <p>我会给你一个简短的回答:make 不关心引号或反斜杠。您使用的任何引号或反斜杠都将逐字传递给 shell。因此,如果您将 <code>echo \"foo\" 传递给 shell,它将打印引号。完全符合预期。

如果你去掉@,正如我上面提到的,事情对你来说会更清楚。

那么,为什么要添加反斜杠?看来您正在添加它们,否则条件 if [ "" != "" ] 将扩展为 if [ "echo "hello world"" != "" ],这是一个语法错误。

一个简单的解决方案是使用单引号而不是双引号:

mytarget:
        $(call my_func, echo "hello world")

define my_func
    if [ '' != '' ]; then \
        ; \
    fi;
endef 

当然,如果您使用包含单引号的值调用 my_func,这将失败。

你有两个解决方案:

首先是使用 make 条件,而不是 shell 条件,因为 make 不关心引号等。这给你:

mytarget:
        $(call my_func, echo "hello world")

my_func = $(if ,)

但这与我的第一个建议相同,只是单独使用 </code>。</p> <p>如果您真的、真的必须在 shell 中执行此操作,那么您必须为 shell 引用内容。 Make 的 <code>subst 函数可以为您做到这一点:

mytarget:
        $(call my_func, echo "hello world")

define my_func
    if [ '$(subst ','\'',)' != '' ]; then \
        ; \
    fi;
endef

' 的所有实例替换为 '\''