我有一个小的java程序:
public class Test { public static void main(String[] args) { System.out.println("A: " + System.getProperty("A")); System.out.println("B: " + System.getProperty("B")); } }
它的工作原理如下:
# java -DA="A B" -DB="B A" Test A: A B B: B A
现在让我们假设有人会像这样从bash执行我的程序,而我无法改变它:
# java "$PARAMS" Test
我在bash变量中有A和B的值,它们都包含空格,如下所示:
# A="A B" # B="B A"
如何设置PARAMS变量的值以使其正常工作?
我试过这个:
# PARAMS="-DA=\"$A\" -DB=\"$B\"" # echo $PARAMS -DA="A B" -DB="B A"
似乎一切都很好,$ PARAMS的价值与上面的例子完全相同,但这就是我得到的:
# set -x; java "$PARAMS" Test; set +x + set -x + java '-DA="A B" -DB="B A"' Test A: "A B" -DB="B A" B: null + set +x
因此,在评估PARAMS变量时,它被单引号包围,因此java将其解释为单个变量A ='“A B”-DB =“B A”'
所以问题是如何使用A和B设置PARAMS的值以按预期进行评估?
由于
答案 0 :(得分:0)
试试这个:
a="java $PARAMS Test"
eval "$a"
或
java "$PARAMS" Test
我认为在这种情况下你需要使用eval
!这是一个bash功能。
我用awk
来表示你的bash问题:
cat test
BEGIN {printf("A: %s\nB: %s\n", a, b);} # this is an awk script
awk -v a="A B" -v b="B A" -f test # normal usage this test
A: A B
B: B A
par="-v a=\"A B\" -v b=\"B A\""
echo $par # $par is ok
-v a="A B" -v b="B A"
awk "$par" -f test # usage of $par
awk: improper assignment: -v a="A B" -v b="B A" ### Error
eval awk $par -f test # with eval ok
A: A B
B: B A
set -x; awk "$par" -f test; set +x # with trace
+ awk '-v a="A B" -v b="B A"' -f test
awk: improper assignment: -v a="A B" -v b="B A"
+ set +x