1

我目前正在测试 GitHub Actions,快速入门解释了如何将超级 linter 添加到 repo,这是在整个 repo 中应用 linting 的一种简单方法——我喜欢这个想法,所以我将它添加到我的 repo 中,其中一个 linter它适用的是 shellcheck,它在我的一个 shell 脚本上引发了一些错误。

该 shell 脚本docker run使用以下代码发出:

docker run --rm \
    "${INTERACTIVE_MODE_FLAG}" \
    ${EXTRA_DOCKER_ARGS} \
    "${IMAGE}":"${IMAGE_VERSION}" "$@"

Shellcheck 正在抛出SC2086 双引号以防止${EXTRA_DOCKER_ARGS}. 我可以通过将代码更改为:

docker run --rm \
    "${INTERACTIVE_MODE_FLAG}" \
    "${EXTRA_DOCKER_ARGS}" \
    "${IMAGE}":"${IMAGE_VERSION}" "$@"

(注意${EXTRA_DOCKER_ARGS}用引号括起来)

docker:无效的参考格式

如果我添加set -x到脚本的顶部,它会显示问题所在:

+ docker run --rm -it '' myimage:mytag docker
: 无效的参考格式。

请注意如何将两个额外的撇号添加到命令中。

我的问题很简单......我该如何解决这个问题?我想消除 Shellcheck 错误,但仍然有一个正常运行的脚本。

4

4 回答 4

4

您的代码使用字符串作为列表,这种概念上的不匹配导致了警告。这是一个真正的问题,你应该解决它。

您应该:

A. 使 EXTRA_DOCKER_ARGS 成为一个列表开始。

或者

B. 将 EXTRA_DOCKER_ARGS 保留为字符串,并考虑如何将其拆分为参数(在空格上?逐行?shell 引用的参数?)。这需要符合设置变量的人的期望。


对于 A,您可以将变量简化为数组并相应地展开:

EXTRA_DOCKER_ARGS=()
docker run --rm \
    "${INTERACTIVE_MODE_FLAG}" \
    "${EXTRA_DOCKER_ARGS[@]}" \
    "${IMAGE}":"${IMAGE_VERSION}" "$@"

对于 B,您可以例如将其视为需要通过 eval 扩展的 shell 引用字符串:

extras=()
eval "extras+=( $EXTRA_DOCKER_ARGS )"
docker run --rm \
    "${INTERACTIVE_MODE_FLAG}" \
    "${extras[@]}" \
    "${IMAGE}":"${IMAGE_VERSION}" "$@"

如果您不解决此问题并继续依赖隐式分词,那么您将无法传递包含空格的额外参数,例如-v "$HOME/My Documents:/mnt"

于 2021-02-05T23:31:54.347 回答
2

在不禁用 shellcheck 警告的情况下:

#!/usr/bin/env bash

# Word split EXTRA_DOCKER_ARGS into extra_docker_args_array
read -r -a extra_docker_args_array <<<"$EXTRA_DOCKER_ARGS"

docker run --rm \
    "$INTERACTIVE_MODE_FLAG" \
    "${extra_docker_args_array[@]}" \
    "$IMAGE:$IMAGE_VERSION" "$@"
于 2021-02-05T23:31:47.157 回答
0

看起来手册页https://www.mankier.com/1/shellcheck描述了覆盖错误的方法。

忽略某些错误:

shellcheck --exclude SC2086 file.sh

如果您可以配置 shellcheck 参数以这种方式运行它,它应该修复它。通常我不喜欢覆盖 linters,但在这种情况下,查看该变量的作用,我看不到解决方法。不能将一堆 args 引用到 docker。它们确实需要作为单独的参数传递。

于 2021-02-05T23:15:55.490 回答
0

刚刚决定使用禁用 shellcheck

# shellcheck disable=SC2086
docker run --rm \
    "${INTERACTIVE_MODE_FLAG}" \
    ${EXTRA_DOCKER_ARGS} \
    "${IMAGE}":"${IMAGE_VERSION}" "$@"

更新。我认为@that-other-guy 的答案更好,所以我改了。

于 2021-02-05T23:25:11.720 回答