在一个bash变量中传递包含空格的多个jvm参数

时间:2016-11-09 10:23:17

标签: bash variables

我有一个小的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的值以按预期进行评估?

由于

1 个答案:

答案 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