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中的条件[重复]的主要内容,如果未能解决你的问题,请参考以下文章