将包含引号的 bash 变量插入到命令中会破坏它

将包含引号的 bash 变量插入到命令中会破坏它

我正在尝试将我拥有的 docker 命令的某些部分分离到 bash 变量中。

我以前所做的事情,效果很好:

DOCKER_ID=$(docker run -e CGO_ENABLED=true -e LDFLAGS='-extldflags "-static"' -v $pkgPath:/src ...etc)

-e标志放入变量并尝试使用该变量:

BUILDER_ARGS="-e CGO_ENABLED=true -e LDFLAGS='-extldflags \"-static\"'"
DOCKER_ID=$(docker run $BUILDER_ARGS -v $pkgPath:/src ...etc)

第二个版本给出了错误:

docker: Error parsing reference: "\"-static\"'" is not a valid repository/tag.

这让我认为我试图插入的变量以某种方式被破坏了。

答案1

问题是 的值BUILDER_ARGS不会被重新解释,因此转义的引号会被按字面意思理解,而不会执行其通常的功能,即引用封闭的字符串。不转义引号也不会起作用,因为在表达式中docker runBUILDER_ARGS的值LDFLAGS将在空格处被拆分。

使用 Bash 数组应该可以解决这些问题:

BUILDER_ARGS=(-e CGO_ENABLED=true -e LDFLAGS='-extldflags "-static"')
DOCKER_ID=$(docker run "${BUILDER_ARGS[@]}" -v $pkgPath:/src ...etc)

这会起作用,因为BUILDER_ARGS数组中的每个元素都将被保留并正确引用。数组的最后一个值是LDFLAGS='-extldflags "-static"',就像这样,作为一个整体,它在 中被很好地保存并按预期执行docker run

相关内容