gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 07:46:39 25 4
gpt4 key购买 nike

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

谢谢

最佳答案

试试这个:

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

关于bash - 在一个 bash 变量中传递包含空格的多个 jvm 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40504660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com