Bash脚本从变量添加参数

时间:2018-07-18 15:07:50

标签: bash shell

我正在研究一个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

1 个答案:

答案 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,这在调试时不是很有用。

相关问题