如何在Bash中移除列表最后三个元素?Docker镜像标签处理
Docker仓库镜像标签筛选:保留除最新三个外的旧标签
我用脚本从自定义Docker仓库拉取镜像版本标签,已经能得到排序后的标签列表,但现在想获取除最新三个之外的标签(标签数不足3个时返回空)。试了unset $tags[-3]没效果,怀疑curl返回的不是数组,另外想问sort -V在这里是不是有效的?
我的标签获取脚本:
r=`curl -sS "$registry/v2/" \ -o /dev/null \ -w '%{http_code}:%header{www-authenticate}'` http_code=`echo "$r" | cut -d: -f1` curl_args=(-sS -H 'Accept: application/vnd.docker.distribution.manifest.v2+json') curl_args+=(-u "$creds") tags=`curl "${curl_args[@]}" "$registry/v2/$image/tags/list" | jq -r .tags[] | sort -V`
示例标签列表:
1.0.0 1.1.2 1.2.0 1.2.1 1.0.1 1.1.0 1.1.1 1.2.1
期望结果:
1.0.0 1.0.1 1.1.0 1.1.1 1.1.2
问题解析与解决步骤
1. sort -V完全有效
sort -V是专门按版本号规则排序的命令,会自动识别数字层级(比如1.10.0会排在1.9.0之后)。你的示例标签经过sort -V处理后,会得到正确的升序排列:
1.0.0 1.0.1 1.1.0 1.1.1 1.1.2 1.2.0 1.2.1 1.2.1
这正是筛选旧标签的正确基础,所以这个命令没问题。
2. unset $tags[-3]无效的原因
你用tags=...``把命令结果赋值给变量时,tags是一个换行分隔的字符串,不是bash数组。bash数组必须用tags=(...)的格式赋值,所以直接对字符串用数组的unset语法肯定不会生效。
3. 两种可行的实现方案
方案一:转为数组后处理
先把排序后的标签存入bash数组,再根据数组长度决定是否剔除最后三个元素:
r=`curl -sS "$registry/v2/" \ -o /dev/null \ -w '%{http_code}:%header{www-authenticate}'` http_code=`echo "$r" | cut -d: -f1` curl_args=(-sS -H 'Accept: application/vnd.docker.distribution.manifest.v2+json') curl_args+=(-u "$creds") # 将排序后的标签存入数组(加uniq去重,不需要可去掉) IFS=$'\n' read -r -d '' -a tags_array < <(curl "${curl_args[@]}" "$registry/v2/$image/tags/list" | jq -r .tags[] | sort -V | uniq) # 数组长度>=3时,输出除最后三个外的所有元素 if [ "${#tags_array[@]}" -ge 3 ]; then printf "%s\n" "${tags_array[@]:0:${#tags_array[@]}-3}" fi
方案二:用head直接截取
如果不想用数组,也可以先统计标签总行数,再用head截取前N-3行:
r=`curl -sS "$registry/v2/" \ -o /dev/null \ -w '%{http_code}:%header{www-authenticate}'` http_code=`echo "$r" | cut -d: -f1` curl_args=(-sS -H 'Accept: application/vnd.docker.distribution.manifest.v2+json') curl_args+=(-u "$creds") # 获取去重并排序后的标签,统计行数 sorted_tags=$(curl "${curl_args[@]}" "$registry/v2/$image/tags/list" | jq -r .tags[] | sort -V | uniq) tag_count=$(echo "$sorted_tags" | wc -l) # 行数>=3时,输出前tag_count-3行 if [ "$tag_count" -ge 3 ]; then echo "$sorted_tags" | head -n $((tag_count - 3)) fi
内容的提问来源于stack exchange,提问作者user3142695
相关产品推荐
相关产品推荐

