【问题标题】:make split string get last element使拆分字符串获取最后一个元素
【发布时间】:2018-12-26 13:43:10
【问题描述】:

在 bash 中,我可以拆分类似于 How to split a string in shell and get the last field

foo=1:2:3:4:5
echo ${foo##*:}

如何在 makefile 中使用 make 实现类似的功能?我发现的任何解决方案都比 bash 吊坠复杂得多。

我尝试使用: $(shell ${foo##*:}) 但这失败了,因为字符串似乎没有正确终止。

【问题讨论】:

  • 它是makefile中的字符串还是变量?如果它是一个变量,那么您可以获取文件并回显该变量。请更详细地解释一下,并举例说明您所指的 makefile 部分。另外,您是要更改该文件还是仅以某种方式使用输出?
  • 我只想使用输出。调用 makefile 时传递变量,即make myvar=my/value/last.thing mytask
  • @GeorgHeiler 所以,它是一个 make 变量,而不是一个 shell 变量。在您的示例中,echo $(lastword $(subst /, ,$(myvar))) 执行您想要的操作(请参阅我的答案以获取详细说明)。
  • 请问您是否也觉得these functions 太复杂而无法考虑?
  • 查看接受的答案 - 否

标签: string bash makefile split gnu-make


【解决方案1】:

如果foo 是一个make 变量

来自Text functions sectionGNU make manual

$(subst from,to,text) 对文本执行文本替换 text:每次出现的from都被to替换。结果是 代替函数调用。

所以:

$(subst :, ,$(foo))

通过用空格替换所有: 来拆分make 变量foo 的内容。仍然来自 GNU make 手册:

$(lastword names…)参数names被认为是一系列 名称,以空格分隔。该值是 系列。

所以:

$(lastword $(subst :, ,$(foo)))

应该做你想做的。 Demo(host>是shell提示符):

host> cat Makefile
foo := 1:2:3:4:5

all:
    $(info $(lastword $(subst :, ,$(foo))))
host> make
5

如果foo是一个shell变量

你必须:

  1. 保护配方的$ 标志,防止在将配方传递到外壳之前执行第一次扩展,
  2. 考虑到配方的每一行都由一个单独的 shell 执行:如果您在一行上定义一个 shell 变量并在另一行上使用它,它不会像您预期的那样工作。
all:
    @foo=1:2:3:4:5 && \
    echo $${foo##*:}

应该做你想做的:$ 符号被正确转义,它是一个单行配方(感谢尾随 \)。演示:

host> cat Makefile
all:
    @foo=1:2:3:4:5 && \
    echo $${foo##*:}
host> make
5

【讨论】:

    【解决方案2】:

    如果您使用double dollar symbol,您将逃避可以传递给外壳的美元。

    例如echo $${foo##*.} 在您的 makefile 中。

    【讨论】:

      【解决方案3】:

      我知道这个问题与GNU make-相关,但我想说明BSD make 的简单程度:

      FOO=1:2:3:4:5
      
      all:
          @echo ${FOO:C/.*://}
      

      还有测试:

      $ make
      5
      

      解释 (man make):${FOO:C/.*://} 中的:C... 命名为变量修饰符:C 修饰符的作用类似于seds 命令。在这种情况下,它会更改由sed 类似表达式定义的变量${FOO} 中的所有word:所有字符和尾随冒号都替换为空(也就是删除它)。

      请注意,.*: 表达式是贪婪的(像往常一样 - .* 可以包含许多冒号)。

      【讨论】:

        猜你喜欢
        • 2016-09-20
        • 2013-01-02
        • 2020-08-25
        • 2010-10-13
        • 1970-01-01
        • 2015-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多