给出这个数组:
arr=(hello asd asd1 asd22 asd333)
我想通过它的值删除一个特定的项目,例如 asd
。我这样做了:
IFS=' '
echo "${arr[@]/asd/}"
但它返回以下内容:
你好 1 22 333
所以我做了这个功能:
function remove_item() {
local item_search="$1"
shift
local arr_tmp=("${@}")
if [ ${#arr_tmp[@]} -eq 0 ]; then
return
fi
local index=0
for item in ${arr_tmp[@]}; do
if [ "$item" = "$item_search" ]; then
unset arr_tmp[$index]
break
fi
let index++
done
echo "${arr_tmp[*]}"
}
arr=(asd asd1 asd22 asd333)
remove_item 'asd' "${arr[@]}"
打印所需的输出:
hello asd1 asd22 asd333
但我必须将它用于非常长的数组,而且我必须多次调用它。而且它的性能很糟糕。
你有更好的选择吗?我们将不胜感激任何提示、技巧或建议。
最佳答案
您可以使用循环遍历数组并删除与指定值匹配的元素:
for i in "${!arr[@]}"; do
[[ "${arr[i]}" == "asd" ]] && unset arr[i]
done
如果您知道数组最多只有一个匹配元素,您甚至可以break
跳出循环:
[[ "${arr[i]}" == "asd" ]] && unset arr[i] && break
|^^^^^^^^|
(this causes the loop to break
as soon as the element is found)
举个例子:
$ arr=(asd asd1 asd22 asd333)
$ for i in "${!arr[@]}"; do [[ "${arr[i]}" == "asd" ]] && unset arr[i]; done
$ echo "${arr[@]}"
asd1 asd22 asd333
关于arrays - 删除数组元素的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22796075/