bash中的条件[重复]

Posted

技术标签:

【中文标题】bash中的条件[重复]【英文标题】:Conditions in bash [duplicate] 【发布时间】:2020-10-23 16:37:01 【问题描述】:

我的 Jenkins 管道的 Bash 脚本按条件删除所有 docker 图像:

docker images --format=".Repository .Tag .ID" |
grep -v "latest" |
cut -d ' ' -f3 |
xargs docker rmi -f

但有时 cut -d ' ' -f3 的图像列表为空,我收到错误:

"docker rmi" requires at least 1 argument.

更新 docker images --format=".Repository .Tag .ID"的输出:

adoptopenjdk/openjdk11 latest                5578e7619e88
nginx                  latest                2622e6cca7eb

如果从不删除,我如何重写脚本以不调用xargs docker rmi -f 不调用?

【问题讨论】:

docker images --format=".Repository .Tag .ID 的输出是什么? 【参考方案1】:

使用 GNU xargs。

在您的 xargs 命令中添加选项 --no-run-if-empty-r

【讨论】:

【参考方案2】:

您应该能够执行两步过程,例如:

ids="$(docker images --format='.ID .Tag' | awk '!/latest/print $1')"
if [[ -n "$ids" ]] ; then
    for id in $ids ; do
        docker rmi -f $id
    done
fi

如果字段中有空格,您通常必须注意边缘情况,但是,因为根据docker doco,所有这三个字段似乎都不允许空格(尝试说 ***倍),这应该不是问题。

您会注意到其他一些变化:

将 ID 移动到输出中的第一个字段,以防存储库或标签中可能存在空格(这会搞砸字段选择,尽管 doco 声明这可能不是问题); 将您的grep/cut 组合组合成一个awk(也针对上一个要点进行调整);和 从输出中删除了存储库名称,因为具有像“populatestandardmachine”这样的存储库名称将导致该存储库被忽略不管标记。李>

【讨论】:

最好使用数组,并使用正确的列 @Gilles,如果您可以将任意命令(可能包含任意空格)的输出放入数组中,请务必告诉我,我会将其添加到答案中,当然假设我这样做的方式存在实际的问题。我怀疑这是可行的,因为据我所知,这三个字段都不允许空白。但我不确定你为什么认为我使用了错误的列,我都将所需的列移到了每一行的开头并且使用了$1 来获取它。跨度> 【参考方案3】:

像这样:

while IFS= read -r _ _ img; do
  docker rmi -f "$img"
done < <(
  docker images --format=".Repository .Tag .ID" | grep -v ' latest '
)

【讨论】:

以上是关于bash中的条件[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Bash条件表达式(-v)检查是不是设置了变量[重复]

简单条件在bash中得到错误的评估结果[重复]

Bash条件混合函数返回值和条件检查[重复]

在bash中运行条件脚本[重复]

Linux基础之bash脚本进阶篇-循环语句(for,while,until)及其特殊用法

bash -- 杀死命令脚本 [重复]