【问题标题】:Bash - String manipulation in MakefileBash - Makefile 中的字符串操作
【发布时间】:2012-09-02 04:54:22
【问题描述】:

我已经了解了使用 bash 进行字符串操作,尤其是关于子字符串替换:

#! /bin/bash

VAR1="aaaa.bbbb.cccc"
VAR2="bbbb*"
echo ${VAR1%${VAR2}}

这个 bash 脚本打印“aaaa.”。我试图将它包含在我的 makefile 中,但我无法让它工作..

SHELL:=/bin/bash

VAR1="aaaa.bbbb.cccc"
VAR2="bbbb*"

all:
    @echo $${VAR1%$${VAR2}}

这个 Makefile 只打印一个空行。 我想我误解了一些东西,但无法弄清楚是什么。任何帮助将不胜感激。

【问题讨论】:

    标签: bash makefile substring


    【解决方案1】:

    B̶a̶s̶h̶̶a̶n̶d̶̶M̶a̶k̶e̶̶d̶o̶̶n̶o̶t̶ ̶h̶a̶v̶e̶̶t̶h̶e̶̶s̶a̶m̶e̶ ̶s̶y̶n̶t̶a̶a̶x̶.̶̶̶Y̶o̶u̶̶n̶e̶e̶d̶̶t̶o̶ ̶n̶o̶t̶̶h̶a̶v̶e̶̶t̶h̶e̶̶s̶a̶m̶e̶ ̶s̶y̶n̶t̶a̶a̶x̶.̶̶y̶o̶u̶̶n̶e̶e̶d̶̶t̶o̶ 这样的内置函数(在本例中)

    See this

    【讨论】:

    • 我知道这些内置函数,但我尝试在 Makefile 中包含本机 bash。 chepner 给了我我想要的东西。无论如何,非常感谢您花时间回答我:)
    【解决方案2】:

    问题在于VAR1VAR2不是shell变量,而是Makefile变量。 更复杂的是,Makefile 配方中的每一行都在单独的 shell 进程中执行,这意味着以下天真的尝试将失败:

    all:
        VAR1="aaaa.bbbb.cccc"
        VAR2="bbbb*"
        @echo $${VAR1%$${VAR2}}
    

    因为VAR1 在一个shell 中定义,VAR2 在另一个shell 中定义,echo 在第三个shell 中定义,两个变量都没有定义。您可以使用以下内容:

    all:
        @VAR1="aaaa.bbbb.cccc"; \
         VAR2="bbbb*"; \
         echo $${VAR1%$${VAR2}};
    

    在 Makefile 中将单个 bash 语句(全部在一个 shell 中执行)拆分为多行。

    【讨论】:

    • 这正是我想要的,你的解释很清楚。我考虑了一些变量的“范围”,但找不到任何相关信息。谢谢!
    • 你不需要花括号。反斜杠足以确保命令在单个 shell 实例中执行。
    【解决方案3】:

    无需在 VAR1 和 VAR2 周围加上双引号。如果要将VAR1和VAR2放在all:上方,则需要使用export

    SHELL:=/bin/bash
    
    export VAR1=aaaa.bbbb.cccc
    export VAR2=bbbb*
    
    all:
        @echo $${VAR1%$${VAR2}}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-06
      • 2016-01-28
      • 2020-03-27
      • 2020-05-03
      • 2013-05-02
      • 2015-04-04
      相关资源
      最近更新 更多