我需要从bash shell中的数组中删除一个元素。通常,我只是做:
array=("${(@)array:# }") 不幸的是,我要删除的元素是一个变量,所以我不能使用上一个命令。下面是一个例子:
array+=(pluto) array+=(pippo) delete=(pluto) array( ${array[@]/$delete} ) -> but clearly doesn't work because of {} 任何想法?
您可以在bash和中进行以下操作zsh:
$ array=(pluto pippo) $ delete=(pluto) $ echo ${array[@]/$delete} pippo $ array=( "${array[@]/$delete}" ) #Quotes when working with strings 如果需要删除多个元素:
... $ delete=(pluto pippo) for del in ${delete[@]} do array=("${array[@]/$del}") #Quotes when working with strings done 警告
实际上,此技术$delete从元素(而不是整个元素)中删除匹配的前缀。
更新资料
要真正删除确切的项目,您需要遍历数组,将目标与每个元素进行比较,然后使用unset删除确切的匹配项。
array=(pluto pippo bob) delete=(pippo) for target in "${delete[@]}"; do for i in "${!array[@]}"; do if [[ ${array[i]} = $target ]]; then unset 'array[i]' fi done done 请注意,如果执行此操作,并且删除了一个或多个元素,则索引将不再是连续的整数序列。
$ declare -p array declare -a array=([0]="pluto" [2]="bob") 一个简单的事实是,数组并不是为用作可变数据结构而设计的。它们主要用于在单个变量中存储项目列表,而无需浪费字符作为定界符(例如,存储可以包含空格的字符串列表)。
如果间隙是一个问题,那么您需要重新构建数组以填补间隙:
for i in "${!array[@]}"; do new_array+=( "${array[i]}" ) done array=("${new_array[@]}") unset new_array
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。