在一个bash变量中传递多个包含空格的jvm参数
我有一个小型java程序: public class Test { public static void main(String[] args) { System.out.println("A: " + System.getProperty("A")); System.out.println("B: " + System.getProperty("B")); } } 公开课考试{ 公共静态void main(字符串[]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 # A="A B" # B="B A" #java-DA=“ab”-DB=“ba”测试 A:B B:B 现在让我们假设有人将像这样从bash执行我的程序,我没有办法更改它: # java "$PARAMS" Test #java“$PARAMS”测试 我在bash变量中有A和B的值,它们都包含空格,如下所示: # java -DA="A B" -DB="B A" Test A: A B B: B A # A="A B" # B="B A" #A=“A B” #B=“B A” 如何设置PARAMS变量的值以使其正常工作 我试过这个: # PARAMS="-DA=\"$A\" -DB=\"$B\"" # echo $PARAMS -DA="A B" -DB="B A" #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 #set-x;java“$PARAMS”测试;集合+x +集合x +java'-DA=“ab”-DB=“ba”测试 A:“A B”-DB=“B A” B:空 +集合+x 因此,在对PARAMS变量求值时,它被单引号包围,因此java将其解释为单个变量a=''ab'-DB=“ba”' 所以问题是,如何使用A和B设置参数的值,以按预期进行计算 谢谢试试这个:在一个bash变量中传递多个包含空格的jvm参数,bash,variables,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")); } } 公开课考试{ 公共静态void main(字符串[]args){
a="java $PARAMS Test"
eval "$a"
或
在你的评论之后
正如我看到的,在这种情况下,您需要使用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
对不起,我的错,将要执行的命令确实是“java”$PARAMS“Test”格式的,它不能被更改-我已经修改了这个问题,它仍然不能以这种方式工作。使用eval会有帮助,但我不能改变它的执行方式。