bash中的条件

bash中的条件,bash,xargs,Bash,Xargs,my Jenkins管道的Bash脚本按条件删除所有docker图像: docker images --format="{{.Repository}} {{.Tag}} {{.ID}}" | grep -v "latest" | cut -d ' ' -f3 | xargs docker rmi -f 但有时图像列表被剪切-d'-f3为空,我得到错误: "docker rmi" requires at least 1 argument

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

docker images --format="{{.Repository}} {{.Tag}} {{.ID}}" |
grep -v "latest" |
cut -d ' ' -f3 |
xargs docker rmi -f
但有时图像列表被剪切-d'-f3为空,我得到错误:

"docker rmi" requires at least 1 argument.
更新 docker图像的输出-格式={{.Repository}{{.Tag}{{.ID}}:


如何重写不调用xargs docker rmi-f not call if even for remove的脚本?

您应该能够执行两步过程,类似于:

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移动到输出中的字段1,以防存储库或标记中可能存在空格,这会影响字段选择,即使doco声明这可能不是问题; 将你的grep/cut组合组合组合成一个awk,并针对上一个要点进行调整;和 从输出中删除了存储库名称,因为使用PopulatesAndardMachine这样的存储库名称将导致忽略该repo,而不管标记是什么。 像这样:

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


在xargs命令中添加选项-no run if empty或-r。

docker图像的输出是什么-format={{.Repository}{{.Tag}{{.ID}}?最好使用数组,并使用适当的column@Gilles,如果您可以将可能包含任意空白的任意命令输出到数组中,无论如何,让我知道,我会把它添加到答案中,当然,假设我做这件事的方式存在实际问题。我怀疑这是可行的,因为据我所知,这三个字段都不允许空白。但我不知道你为什么认为我使用了错误的列,我已经将所需的列移动到每行的开头,并使用了1美元。
while IFS= read -r _ _ img; do
  docker rmi -f "$img"
done < <(
  docker images --format="{{.Repository}} {{.Tag}} {{.ID}}" | grep -v ' latest '
)