首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在不导致脚本失败的情况下满足script检查?

如何在不导致脚本失败的情况下满足script检查?
EN

Stack Overflow用户
提问于 2021-02-05 23:08:02
回答 4查看 963关注 0票数 1

我目前正在测试GitHub操作,快速启动解释了如何将超级链接添加到回购中,这是一种在整个回购过程中应用皮毛的简单方法--我喜欢这个想法,所以我把它添加到了回购中,它应用的一个指针是外壳检查,它在我的一个shell脚本上抛出了一些错误。

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

代码语言:javascript
运行
复制
docker run --rm \
    "${INTERACTIVE_MODE_FLAG}" \
    ${EXTRA_DOCKER_ARGS} \
    "${IMAGE}":"${IMAGE_VERSION}" "$@"

谢尔切克正在${EXTRA_DOCKER_ARGS}上发布${EXTRA_DOCKER_ARGS}。通过将代码更改为:

代码语言:javascript
运行
复制
docker run --rm \
    "${INTERACTIVE_MODE_FLAG}" \
    "${EXTRA_DOCKER_ARGS}" \
    "${IMAGE}":"${IMAGE_VERSION}" "$@"

(注:用引号包装${EXTRA_DOCKER_ARGS} )

docker:无效的引用格式

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

  • docker run --rm -it '‘myimage:mytag 码头:无效的参考格式。

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

我的问题很简单。我怎么才能解决这个问题?我想消除Shellcheck错误,但仍然有一个有效的脚本。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2021-02-05 23:31:54

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

你应该要么:

首先,让EXTRA_DOCKER_ARGS成为一个清单。

将EXTRA_DOCKER_ARGS保持为字符串,并考虑如何将其拆分为参数(在空格上?一行行?壳牌引用的论点?)这需要与设置变量的人的期望相匹配。

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

代码语言:javascript
运行
复制
EXTRA_DOCKER_ARGS=()
docker run --rm \
    "${INTERACTIVE_MODE_FLAG}" \
    "${EXTRA_DOCKER_ARGS[@]}" \
    "${IMAGE}":"${IMAGE_VERSION}" "$@"

对于B,您可以将它作为一个shell引号字符串来处理,该字符串需要按eval展开:

代码语言:javascript
运行
复制
extras=()
eval "extras+=( $EXTRA_DOCKER_ARGS )"
docker run --rm \
    "${INTERACTIVE_MODE_FLAG}" \
    "${extras[@]}" \
    "${IMAGE}":"${IMAGE_VERSION}" "$@"

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

票数 4
EN

Stack Overflow用户

发布于 2021-02-05 23:31:47

不禁用外壳检查警告:

代码语言:javascript
运行
复制
#!/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" "$@"
票数 2
EN

Stack Overflow用户

发布于 2021-02-05 23:15:55

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

忽略某些错误:

代码语言:javascript
运行
复制
shellcheck --exclude SC2086 file.sh

如果您可以配置should检查参数来以那种方式运行它,那么它应该修复它。通常,我不喜欢重写指针,但在这种情况下,看看这个变量的作用,我看不出有什么方法可以绕过它。不能双倍引用一堆args到码头。它们真的需要作为单独的args来传递。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66071810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档