我正在研究一个Bash脚本,它将在检测到Java版本大于10时添加模块自定义。我似乎无法正确读取自定义内容作为java命令的参数< / p>
#!/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解释为:
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
因此,我认为问题在于,单引号出现在传递给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
但这变成了:
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
然后bash将该参数解释为一个大参数。
EDIT2:
再试一次,但这一次在$ {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
答案 0 :(得分:5)
问题在于,您将两个单独的参数合并在一起:
"--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
还请注意,set -x
输出中出现或不出现的所有引号纯为歧义标记,这对您有利。他们不会更改或决定要传递给命令的内容。只是为了让您的人眼可以辨别参数数组之间的区别,例如(以Java表示法):
{"hello", "world"}
{"hello", "world", ""}
{"hello world"}
{"hello world", "", ""}
由于您只是附加并打印了这些单词,所有这些不同的数组都将读取hello world
,这在调试时不是很有用。