Bash变量的后期绑定,同时保留空格

时间:2013-04-09 20:28:26

标签: bash shell unix

我正在尝试对我的包在make命令中的目录进行后期绑定。基本上,WITH_OPTIONS命令行包含一个以空格分隔的链接选项列表,类似于configure脚本。问题是在解析了这个脚本的命令行之后,目录被绑定得很晚,所以我需要评估模板字符串以获得正确的变量绑定。最接近我可以通过Google搜索和阅读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包含的是一个包含一个命令和两个参数的字符串:

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?

3 个答案:

答案 0 :(得分:1)

为什么不简单地将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

答案 1 :(得分: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所指出的,Arrays是不必要的,但是因为Johnathan Leffler指出make,我试图执行的命令是忽略双引号的东西,正确的方法是在执行$ CMD时调用eval。这将需要一些工作来适应我的脚本,但我认为这是我设置它时问题的基本解决方案。虽然我不能给予ennuikiller这个解决方案的全部功劳,但我很高兴至少给你一个+1的评分。

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

答案 2 :(得分: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 !!!