如何在 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
将 '
的所有实例替换为 '\''
。
我有一个包含以下内容的 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
将 '
的所有实例替换为 '\''
。