0

我正在尝试对我的包在 make 命令中的目录进行后期绑定。基本上, WITH_OPTIONS 命令行包含一个以空格分隔的链接选项列表,类似于配置脚本。问题是目录绑定较晚,在解析此脚本的命令行之后,所以我需要评估模板字符串以获得正确的变量绑定。通过谷歌搜索和阅读 Bash 常见问题,我能得到的最接近的结果,尤其是第 50 条是这样的:

MAKE_INSTALL="make install"
TEMPLATE=('--first=$a' '--second=$b' '--third=$a')

# Parse Parameters
a=/first/path
b=/second/path
TEMPLATE_REPL=$( eval echo ${TEMPLATE[@]} )
CMD="$MAKE_INSTALL WITH_OPTIONS=\"$TEMPLATE_REPL\""
$CMD

我期望 $CMD 包含的是一个带有一个命令和 2 个参数的字符串:

make install WITH_OPTIONS="--first=/first/path --second=/second/path --third=/first/path"

但是,我无法让 bash 将引号中的部分保持在一起,因此它一直将其解析为:

make install 'WITH_OPTIONS="--first=/first/path' '--second=/second/path' '--third=/first/path"'

这显然是完全错误的,并且在执行时会导致错误的命令行。

我错过了什么?如何将引号之间的位保留为一个参数,而不是 3?

4

3 回答 3

2

为什么不简单地将 TEMPLATE 设为字符串:

TEMPLATE='--first=$a --second=$b --third=$a'
$ a=/first/path
$ b=/second/path
$ eval echo $TEMPLATE
--first=/first/path --second=/second/path --third=/first/path
于 2013-04-09T20:33:16.327 回答
1
MAKE_INSTALL="make install"
TEMPLATE='--first=$a --second=$b --third=$a'

# Parse Parameters
a=/first/path
b=/second/path
CMD="$MAKE_INSTALL WITH_OPTIONS=\"$TEMPLATE\""
eval $CMD

正如 ennuikiller 指出的那样,数组是不必要的,但是因为 Johnathan Leffler 指出 make,我试图执行的命令是忽略双引号的东西,正确的方法是在执行 $CMD 时调用 eval。这将需要一些工作来适应我的脚本,但我认为这是我设置问题的基本解决方案。虽然我不能完全相信这个解决方案,但我很高兴至少给你一个 +1 的评分。

(Ed:因为需要第二个 eval,所以可以去掉第一个 eval。)

于 2013-04-09T21:09:47.207 回答
0

这是在 bash 脚本中使用后期绑定的通用示例,带有变量(变量替换):

#!/usr/bin/env bash

A_tmp="echo -n Late binding: \$B !!!"             ## note the slash before $
B="test string"

A=`eval $A_tmp`

echo $A

此脚本打印:

Late binding: test string !!!
于 2013-04-26T06:57:46.270 回答