Bash脚本从变量添加参数

Bash脚本从变量添加参数,bash,shell,Bash,Shell,我正在编写一个Bash脚本,如果它检测到Java版本大于10,它将添加模块定制。我似乎无法将定制作为java命令的参数正确读入 #!/bin/bash # Expect format: java full version "10.0.1+10" jver="$( java -fullversion 2>&1)" IFS='.-_^+^"' read -ra ADDR <<< "$jver" # jver is read into an array a

我正在编写一个Bash脚本,如果它检测到Java版本大于10,它将添加模块定制。我似乎无法将定制作为java命令的参数正确读入

#!/bin/bash


# Expect format:  java full version "10.0.1+10"
jver="$( java -fullversion 2>&1)"

IFS='.-_^+^"'
read -ra ADDR <<< "$jver"    # jver is read into an array as tokens separated by IFS


#java version < 10
if [ ${ADDR[1]} -lt 10 ]; then
    moduleCustomizations=""
else
    moduleCustomizations=("--illegal-access=warn" "--add-opens java.desktop/java.awt.color=ALL-UNNAMED" "--add-opens java.desktop/sun.font=ALL-UNNAMED" "--add-opens java.desktop/java.beans=ALL-UNNAMED" "--add-opens java.base/java.lang=ALL-UNNAMED" "--add-opens java.base/java.lang.module=ALL-UNNAMED" "--add-opens java.desktop/javax.swing=ALL-UNNAMED" "--add-opens java.desktop/java.awt=ALL-UNNAMED" "--add-opens java.desktop/sun.awt.image=ALL-UNNAMED" "--add-opens java.desktop/javax.accessibility=ALL-UNNAMED" "--add-opens java.desktop/sun.awt=ALL-UNNAMED" "--add-opens java.base/jdk.internal.module=ALL-UNNAMED" "--add-opens java.base/java.security.cert=ALL-UNNAMED" "--add-opens java.base/java.security=ALL-UNNAMED" "--add-opens java.base/java.net=ALL-UNNAMED" "--add-opens java.base/java.lang.ref=ALL-UNNAMED")

fi

set -x

java "${moduleCustomizations[@]}"  -Xmx1024m com.test.myClass
因此,我认为问题在于,除了传递给java命令的第一项外,所有项中都出现了单引号。如何让bash正确地传递参数

编辑:

添加另一个方法我尝试将$moduleCustomizations保留为一个字符串:

#!/bin/bash


# Expect format:  java full version "10.0.1+10"
jver="$( java -fullversion 2>&1)"

IFS='.-_^+^"'
read -ra ADDR <<< "$jver"    # jver is read into an array as tokens separated by IFS


#java version < 10
if [ ${ADDR[1]} -lt 10 ]; then
    moduleCustomizations=""
else
    moduleCustomizations="--illegal-access=warn --add-opens java.desktop/java.awt.color=ALL-UNNAMED --add-opens java.desktop/sun.font=ALL-UNNAMED --add-opens java.desktop/java.beans=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.module=ALL-UNNAMED --add-opens java.desktop/javax.swing=ALL-UNNAMED --add-opens java.desktop/java.awt=ALL-UNNAMED --add-opens java.desktop/sun.awt.image=ALL-UNNAMED --add-opens java.desktop/javax.accessibility=ALL-UNNAMED --add-opens java.desktop/sun.awt=ALL-UNNAMED --add-opens java.base/jdk.internal.module=ALL-UNNAMED --add-opens java.base/java.security.cert=ALL-UNNAMED --add-opens java.base/java.security=ALL-UNNAMED --add-opens java.base/java.net=ALL-UNNAMED --add-opens java.base/java.lang.ref=ALL-UNNAMED"

fi

set -x

java "${moduleCustomizations}"  -Xmx1024m com.test.myClass
bash将这个论点解释为一个大论点

编辑2:

请重试,但这次在${moduleCustomizations}周围不带引号。它似乎删除了所有破折号:

java '' '' illegal 'access=warn ' '' add 'opens java' desktop/java awt color=ALL 'UNNAMED ' '' add 'opens java' desktop/sun font=ALL 'UNNAMED ' '' add 'opens java' desktop/java beans=ALL 'UNNAMED ' '' add 'opens java' base/java lang=ALL 'UNNAMED ' '' add 'opens java' base/java lang module=ALL 'UNNAMED ' '' add 'opens java' desktop/javax swing=ALL 'UNNAMED ' '' add 'opens java' desktop/java awt=ALL 'UNNAMED ' '' add 'opens java' desktop/sun awt image=ALL 'UNNAMED ' '' add 'opens java' desktop/javax accessibility=ALL 'UNNAMED ' '' add 'opens java' desktop/sun awt=ALL 'UNNAMED ' '' add 'opens java' base/jdk internal module=ALL 'UNNAMED ' '' add 'opens java' base/java security cert=ALL 'UNNAMED ' '' add 'opens java' base/java security=ALL 'UNNAMED ' '' add 'opens java' base/java net=ALL 'UNNAMED ' '' add 'opens java' base/java lang ref=ALL UNNAMED -Xmx1024m com.test.myClass

问题在于,您正在合并两个独立的参数:

"--add-opens java.desktop/java.awt.color=ALL-UNNAMED"
不要试图让它变得更难,因为你不会尝试跑步:

java "--add-opens java.desktop/java.awt.color=ALL-UNNAMED"
只需在
java
命令后直接将要添加的内容放入数组中,而无需尝试添加其他引用:

java --add-opens java.desktop/java.awt.color=ALL-UNNAMED
变成:

args=( --add-opens java.desktop/java.awt.color=ALL-UNNAMED )
java "${args[@]}"
在代码中:

#!/bin/bash

# Expect format:  java full version "10.0.1+10"
jver="$( java -fullversion 2>&1)"

# jver is read into an array as tokens separated by IFS
IFS='.-_^+"' read -ra ADDR <<< "$jver"    

#java version < 10
if [[ "${ADDR[1]}" -lt 10 ]]; then
    moduleCustomizations=()
else
    moduleCustomizations=(
       --illegal-access=warn
       --add-opens java.desktop/java.awt.color=ALL-UNNAMED
       --add-opens java.desktop/sun.font=ALL-UNNAMED
       --add-opens java.desktop/java.beans=ALL-UNNAMED
       --add-opens java.base/java.lang=ALL-UNNAMED
       --add-opens java.base/java.lang.module=ALL-UNNAMED
       --add-opens java.desktop/javax.swing=ALL-UNNAMED
       --add-opens java.desktop/java.awt=ALL-UNNAMED
       --add-opens java.desktop/sun.awt.image=ALL-UNNAMED
       --add-opens java.desktop/javax.accessibility=ALL-UNNAMED
       --add-opens java.desktop/sun.awt=ALL-UNNAMED
       --add-opens java.base/jdk.internal.module=ALL-UNNAMED
       --add-opens java.base/java.security.cert=ALL-UNNAMED
       --add-opens java.base/java.security=ALL-UNNAMED
       --add-opens java.base/java.net=ALL-UNNAMED
       --add-opens java.base/java.lang.ref=ALL-UNNAMED
    )
fi
set -x
java "${moduleCustomizations[@]}"  -Xmx1024m com.test.myClass

因为如果您只是添加并打印单词,所有这些不同的数组都将读取
hello world
,这在调试时不是很有帮助。

问题是您正在合并两个独立的参数:

"--add-opens java.desktop/java.awt.color=ALL-UNNAMED"
不要试图让它变得更难,因为你不会尝试跑步:

java "--add-opens java.desktop/java.awt.color=ALL-UNNAMED"
只需在
java
命令后直接将要添加的内容放入数组中,而无需尝试添加其他引用:

java --add-opens java.desktop/java.awt.color=ALL-UNNAMED
变成:

args=( --add-opens java.desktop/java.awt.color=ALL-UNNAMED )
java "${args[@]}"
在代码中:

#!/bin/bash

# Expect format:  java full version "10.0.1+10"
jver="$( java -fullversion 2>&1)"

# jver is read into an array as tokens separated by IFS
IFS='.-_^+"' read -ra ADDR <<< "$jver"    

#java version < 10
if [[ "${ADDR[1]}" -lt 10 ]]; then
    moduleCustomizations=()
else
    moduleCustomizations=(
       --illegal-access=warn
       --add-opens java.desktop/java.awt.color=ALL-UNNAMED
       --add-opens java.desktop/sun.font=ALL-UNNAMED
       --add-opens java.desktop/java.beans=ALL-UNNAMED
       --add-opens java.base/java.lang=ALL-UNNAMED
       --add-opens java.base/java.lang.module=ALL-UNNAMED
       --add-opens java.desktop/javax.swing=ALL-UNNAMED
       --add-opens java.desktop/java.awt=ALL-UNNAMED
       --add-opens java.desktop/sun.awt.image=ALL-UNNAMED
       --add-opens java.desktop/javax.accessibility=ALL-UNNAMED
       --add-opens java.desktop/sun.awt=ALL-UNNAMED
       --add-opens java.base/jdk.internal.module=ALL-UNNAMED
       --add-opens java.base/java.security.cert=ALL-UNNAMED
       --add-opens java.base/java.security=ALL-UNNAMED
       --add-opens java.base/java.net=ALL-UNNAMED
       --add-opens java.base/java.lang.ref=ALL-UNNAMED
    )
fi
set -x
java "${moduleCustomizations[@]}"  -Xmx1024m com.test.myClass

因为如果您只是添加并打印单词,所有这些不同的数组都将读取
hello world
,这在调试时不是很有帮助。

为什么不将
moduleCustomizations
作为单个字符串填充,如
moduleCustomizations=“--非法访问=警告--添加打开java.desktop/java.awt.color=ALL-UNNAMED…”
?我开始尝试这种方法,但它似乎将moduleCustomizations变量解释为一个大参数。我已经修改以添加一个示例,请尝试使用单字符串选项,但调用java${code>java${moduleCustomizations}”-Xmx1024m com.test.myClass。在
moduleCustomizations
周围没有引号是直接相关的。Re:无引号扩展删除破折号,这是因为您在
IFS
中有破折号。这绝对不是说无引号扩展是您应该使用的做法;它可能比任何其他扩展都要负责更多的条目其他单一错误。如另一个人的回答所示,使用数组意味着您可以在可选添加的参数中使用引号/转义/空格/etc。为什么不将
moduleCustomizations
填充为单个字符串,如
moduleCustomizations=“--非法访问=警告--add打开java.desktop/java.awt.color=ALL-UNNAMED…”。。。。“
?我开始尝试这种方法,但它似乎将moduleCustomizations变量解释为一个大参数。我已经修改添加了一个示例,请尝试使用单字符串选项,但调用java类似的
java${moduleCustomizations}-Xmx1024m com.test.myClass
。在
moduleCustomizations前后不加引号是直接相关的。Re:unquoted expansion删除破折号,这是因为在
IFS
中有破折号。这绝对不是说非上市扩张是你应该使用的做法;它可能比任何其他单个错误都要负责更多的条目。正如另一个人的回答所示,使用数组意味着您可以在可选添加的参数中使用引号/escaping/spaces/etc。