Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 使拆分字符串获取最后一个元素_String_Bash_Makefile_Split_Gnu Make - Fatal编程技术网

String 使拆分字符串获取最后一个元素

String 使拆分字符串获取最后一个元素,string,bash,makefile,split,gnu-make,String,Bash,Makefile,Split,Gnu Make,在bash中,我可以拆分类似于 如何在makefile中实现与make类似的功能?我找到的任何解决方案都比bash挂件复杂得多 我尝试使用: $(shell${foo###*:})但这失败了,因为字符串似乎没有正确终止。如果使用a,将转义美元,然后可以将其传递给shell e、 如果foo是一个make变量,则在makefile中的echo$$${foo###*.} 从以下地址: $(subst from,to,text)对文本执行文本替换 text:每次出现的from都替换为to。结果是 替

在bash中,我可以拆分类似于

如何在makefile中实现与make类似的功能?我找到的任何解决方案都比bash挂件复杂得多

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

如果使用a,将转义美元,然后可以将其传递给shell

e、 如果
foo
是一个make变量,则在
makefile
中的
echo$$${foo###*.}

从以下地址:

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

因此:

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

$(lastword名称…
参数名称被视为一系列 名称,用空格分隔。该值是列表中的姓氏 系列

因此:

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

如果
foo
是shell变量 你必须:

  • 保护配方的
    $
    符号不受make在将配方传递到shell之前执行的第一次扩展的影响
  • 假设您的配方的每一行都由一个单独的shell执行:如果您在一行上定义一个shell变量并在另一行上使用它,那么它不会像您所期望的那样工作
  • 应该做你想做的事:
    $
    符号被正确转义,它是一个单行配方(多亏了后面的
    \
    )。演示:


    我知道这个问题是
    gnumake
    -相关的,但我想展示一下
    bsdmake
    中的问题有多简单:

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

    $ make
    5
    
    解释():
    ${FOO:C/*://}
    命名变量修饰符中的
    :C..
    :C
    修饰符的工作方式类似于
    sed
    s
    命令。在这种情况下,它会将变量
    ${FOO}
    中的所有单词更改为类似于
    sed
    的表达式定义的所有单词:将所有字符和尾随冒号替换为零(也称为删除它)


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

    它是生成文件中的字符串还是变量?如果它是一个变量,那么您可以为该文件提供源代码并回显该变量。请更详细地解释,并给出您所指的makefile部分的示例。另外,您想更改该文件还是以某种方式使用输出?我只想使用输出。调用makefile时传递变量,即
    make myvar=my/value/last.thing mytask
    @GeorgHeiler,因此,它是一个make变量,而不是shell变量。在您的示例<代码> ECHOR$(LASTWORD $(SUST/($(MyVar)))< /C>中做您想要的(请参阅我的详细解释的答案)。请问您是否也觉得太复杂而无法考虑?请参阅已接受的答案-NO。
    $(lastword $(subst :, ,$(foo)))
    
    host> cat Makefile
    foo := 1:2:3:4:5
    
    all:
        $(info $(lastword $(subst :, ,$(foo))))
    host> make
    5
    
    all:
        @foo=1:2:3:4:5 && \
        echo $${foo##*:}
    
    host> cat Makefile
    all:
        @foo=1:2:3:4:5 && \
        echo $${foo##*:}
    host> make
    5
    
    FOO=1:2:3:4:5
    
    all:
        @echo ${FOO:C/.*://}
    
    $ make
    5