Bash 如何通过环境变量传递带空格的参数?

Bash 如何通过环境变量传递带空格的参数?,bash,shell,Bash,Shell,在bashshell上,我想通过环境变量传递参数。 像这样 $ export DOCKER_OPTIONS="-p 9200:9200 -e ES_JAVA_OPTS='-Xmx1g -Xms1g' -d " $ docker run -d $DOCKER_OPTIONS elasticsearch 我希望“ES_JAVA_OPTS='-Xmx1g-Xms1g'”作为选项值“-e”传递。但是我找不到办法 $ set -x $ docker run -d $DOCKER_OPTIONS elas

在bashshell上,我想通过环境变量传递参数。 像这样

$ export DOCKER_OPTIONS="-p 9200:9200 -e ES_JAVA_OPTS='-Xmx1g -Xms1g' -d "
$ docker run -d $DOCKER_OPTIONS elasticsearch
我希望“ES_JAVA_OPTS='-Xmx1g-Xms1g'”作为选项值“-e”传递。但是我找不到办法

$ set -x
$ docker run -d $DOCKER_OPTIONS elasticsearch
+ docker run -d -p 9200:9200 -e 'ES_JAVA_OPTS='\''-Xmx1g' '-Xms1g'\''' elasticsearch
unknown shorthand flag: 'X' in -Xms1g'
这将-Xms1g分离为另一个选项

$ docker run -d "$DOCKER_OPTIONS" elasticsearch
+ docker run -d '-p 9200:9200 -e ES_JAVA_OPTS='\''-Xmx1g -Xms1g'\''' elasticsearch
docker: Invalid containerPort: 9200 -e ES_JAVA_OPTS='-Xmx1g -Xms1g'.
这将参数捆绑在一起


我该怎么办?

使用数组来避免这些棘手的解析问题。数组非常好,因为在定义数组时不需要进行任何特殊的引用。在展开引号时,唯一需要注意的地方是:始终在“${array[@]}”周围加引号

请注意,
export
不是必需的,因为您是通过docker的命令行而不是作为环境变量将选项传递给docker的

此外,所有大写名称都保留给shell。在定义自己的变量时,最好避免使用它们

dockerOptions=(-p 9200:9200 -e ES_JAVA_OPTS='-Xmx1g -Xms1g' -d)
docker run -d "${dockerOptions[@]}" elasticsearch