arrays - 减去 2 个字符串数组时的奇怪行为
问题描述
我array1
从array2
我的 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
虽然减法看起来不错,但它也monitoring
从dev-monitoring-busk
. 我不明白为什么。有人能指出这里有什么问题吗?
我知道还有其他解决方案可以解决 2 个数组之间的差异,例如
echo ${Array1[@]} ${Array2[@]} | tr ' ' '\n' | sort | uniq -u
但这更多的是差异而不是减法。所以这对我不起作用。
解决方案
如果我理解正确,您想要的不是从 减去array1
,array2
而是从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
.
推荐阅读
- vba - 将行值复制到另一个工作表
- python - int() 参数必须是字符串、类似字节的对象或数字,而不是“NoneType”
- java - Java Lambda - 找到包含 Vector3D 实例的三角形极值的更好方法
- python - 如何在本地主机上的 python 中将数据打印为表
- unity3d - 在 Canvas 内计算 3D 对象的大小
- angular - ng-bootstrap 和组件之间的数据绑定不起作用
- ruby-on-rails - 是否可以限制与 ActiveModelSerializers 关联的字段?
- jquery - API数据返回,使用数组显示数据使用JQuery
- kotlin - 为什么 lateinit 不能与 elvis 运算符一起使用,以及它与可选项的具体不同之处
- php - Apache 在子目录中重写 htaccess