首页 > 解决方案 > 减去 2 个字符串数组时的奇怪行为

问题描述

array1array2 我的 2 个数组中减去

array1=(apps argocd cache core dev-monitoring-busk test-ci-cd)
array2=(apps argocd cache core default kube-system kube-public kube-node-lease monitoring)

我减去它们的方式是

for i in "${array2[@]}"; do
         array1=(${array1[@]//$i})
done

echo ${array1[@]}

现在我的预期结果应该是

dev-monitoring-busk test-ci-cd

但我的预期结果是

dev--busk test-ci-cd

虽然减法看起来不错,但它也monitoringdev-monitoring-busk. 我不明白为什么。有人能指出这里有什么问题吗?

我知道还有其他解决方案可以解决 2 个数组之间的差异,例如

echo ${Array1[@]} ${Array2[@]} | tr ' ' '\n' | sort | uniq -u

但这更多的是差异而不是减法。所以这对我不起作用。

标签: arraysbash

解决方案


如果我理解正确,您想要的不是从 减去array1array2而是从array2减去array1。正如其他人指出的那样,bash替换不适用于数组。相反,您可以使用associative array如果您的 bash 版本 >= 4.2。

请尝试以下方法:

declare -a array1=(apps argocd cache core dev-monitoring-busk test-ci-cd)
declare -a array2=(apps argocd cache core default kube-system kube-public kube-node-lease monitoring)

declare -A mark
declare -a ans

for e in "${array2[@]}"; do
    mark[$e]=1
done

for e in "${array1[@]}"; do
    [[ ${mark[$e]} ]] || ans+=( "$e" )
done

echo "${ans[@]}"
  • array2它首先使用关联数组迭代并标记其元素mark
  • 然后它会遍历array1并将元素添加到 中,answer 如果它在mark.

推荐阅读