Makefile将变量传递给Bash脚本

3
我想从Makefile中向一个或多个不同的make目标传递由引号括起来的子字符串组成的空格分隔字符串。该目标只是执行一个bash脚本,然后将每个引号括起来的子字符串作为位置参数传递给另一个脚本。
测试的Makefile:
FOO="foo bar"
FOO+="bar baz"
FOO+="baz qux"
FOO+="qux"
export FOO

t:
    ./script.sh

这是 "script.sh" 文件的内容:
#! /bin/bash
set -ex

./thing.sh "$FOO"

这行不通;输出结果为(注意周围的单引号):
 ~/c/scrap
(i) make t
./script.sh
+ ./thing.sh '"foo bar" "bar baz" "baz qux" "qux"'

要明确一点,我想要的是将许多参数传递给 thing.sh 而不是单个参数,并且我需要引用每个参数,因为它可能包含空格或特殊字符。
 ~/c/scrap
(i) make t
./script.sh
+ ./thing.sh "foo bar" "bar baz" "baz qux" "qux"

最好的方法是什么?理想情况下,我们应该在Makefile中解决这个问题,以避免在每个使用FOO的目标中重复解决方案。

1
我没有意识到你需要保留双引号。 - user8680478
2
你的双引号中的任何“单词”是否包含空格或其他特殊字符?你确定 script.sh(和 thing.sh)需要引号,还是只是想让它像在控制台上键入每个单词时一样运行。区别在于 script.sh$1 的值应该是 "foo" 还是仅为 foo - Jonathan Leffler
是的,它们包含空格,因此需要加引号;很抱歉我在最初的示例中没有澄清这一点。(不过在我的解决方案中有说明。)我会编辑问题以更准确地反映要求。 - yangmillstheory
1个回答

0
这是一种解决Makefile级别问题的方法:
FOO="foo bar"
FOO+="bar baz"
FOO+="baz qux"
FOO+="qux"
export FOO

t:
    eval './script.sh $(FOO)'

这是 script.sh
#! /bin/bash
set -ex

./thing.sh "$@"

这是 thing.sh 文件。
#! /bin/bash
echo "$1"
echo "$2"
echo "$3"
echo "$4"

输出:

 ~/c/scrap
(i) make t
eval './script.sh "foo bar" "bar baz" "baz qux" "qux"'
+ ./thing.sh 'foo bar' 'bar baz' 'baz qux' qux
foo bar
bar baz
baz qux
qux

2
“eval”的意义是什么?./script.sh $(FOO)将会做完全相同的事情。 - rici
我认为eval的目的是将多个参数传递给script.sh而不是单个字符串。 - yangmillstheory
没有区别。eval 'whatever'whatever 做的事情是一样的。这就是 eval 的定义:它执行其参数,就像它是一个 shell 命令一样。 - rici

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接