【问题标题】:Passing multiple jvm arguments containg spaces in one bash variable在一个 bash 变量中传递多个包含空格的 jvm 参数
【发布时间】:2017-03-23 03:02:54
【问题描述】:

我有一个小的java程序:

公共类测试{ 公共静态无效主要(字符串[]参数){ System.out.println("A:" + System.getProperty("A")); System.out.println("B:" + System.getProperty("B")); } }

它是这样工作的:

# java -DA="A B" -DB="B A" 测试 甲:乙乙 乙:乙

现在让我们假设有人要像这样从 bash 执行我的程序,而我无法更改它:

# java "$PARAMS" 测试

我在 bash 变量中有 A 和 B 的值,它们都包含空格,如下所示:

#A="A B" #B="B A"

如何设置 PARAMS 变量的值以使其正常工作?

我试过了:

#PARAMS="-DA=\"$A\" -DB=\"$B\"" # 回显 $PARAMS -DA="A B" -DB="B A"

似乎一切都很好,$PARAMS 的值和上面的例子完全一样,但是我得到的是这样的:

# 设置-x; java "$PARAMS" 测试;设置 +x + 设置-x + java '-DA="A B" -DB="B A"' 测试 A:“A B”-DB="B A" 乙:空 + 设置 +x

因此,在评估 PARAMS 变量时,它被单引号包围,因此 java 将其解释为单个变量 A = '"A B" -DB="B A"'

所以问题是如何使用 A 和 B 设置 PARAMS 的值以按预期进行评估?

谢谢

【问题讨论】:

    标签: bash variables


    【解决方案1】:

    试试这个:

    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
    

    【讨论】:

    • 对不起,我的错,将要执行的命令确实是 'java "$PARAMS" Test' 格式,并且无法更改 - 我已经修改了问题,它仍然无法正常工作这边走。使用 eval 会有所帮助,但我无法更改它的执行方式。
    猜你喜欢
    • 1970-01-01
    • 2017-10-28
    • 2018-02-26
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 2012-09-07
    • 2014-12-25
    相关资源
    最近更新 更多