Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在一个bash变量中传递多个包含空格的jvm参数_Bash_Variables - Fatal编程技术网

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

在一个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){

我有一个小型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设置参数的值,以按预期进行计算

谢谢

试试这个:

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会有帮助,但我不能改变它的执行方式。