数组 – 按内容(存储在变量中)从bash数组中删除元素,而不留空格

参见英文答案 > Remove an element from a Bash array16个
我在bash脚本中有一个数组列表,还有一个变量var.我知道$var出现在${list [@]}中,但没有简单的方法来确定它的索引.我想将其从列表中删除.

This回答达到了我所需要的非常接近的东西,除了列表保留$var一次的空元素.注意,例如:

$list=(one two three)
$var="two"
$list=( "${list[@]/$var}" )
$echo ${list[@]}
one three
$echo ${#list[@]}
3

如果我使用delete =(“$var”)并在第三行中将$var替换为$delete,则会发生同样的情况.另外,做list =(“${list [@] / $var /}”)也没有区别.
(我会注意到,尝试对该答案的评论,我设法使用list =(“${list [@] /%$var}”)仅匹配整个单词,省略#.)

我还看到this回答提出一个很好的技巧来跟踪索引和使用未设置,但这在我的情况下是不可行的.最后,同样的问题也出现在here,除了OP对结果感到满意,并且可能没有碰到空元素在我的脚本中为我创建的问题,当我遍历列表时.我尝试通过如下使用扩展来否定该问题,没有任何明显的影响:

for item in "${list[@]}"; do
  if [ -n ${item:+'x'} ];then
    ...
  fi
done

我做的时候也是一样[${#item}> 0],我的想法已经不多了.建议?

编辑:

我不明白为什么会发生这种情况,但@ l0b0的评论让我注意到了一些事情.使用上面的序言,我得到:

$for item in "${list[@]}"; do echo "Here!"; done
Here!
Here!
Here!

但:

$for item in ${list[@]}; do echo "Here!"; done
Here!
Here!

我不确定我可以省略脚本中的引号,因为项目相当复杂(文件名和路径,都包含空格和奇数字符).

您可以从现有数组中删除元素,但整个过程不是很简单,可能看起来像黑客.
#!/bin/bash

list=( "one" "two" "three" "four" "five" )
var1="two"
var2="four"

printf "%s\n" "Before:"
for (( i=0; i<${#list[@]}; i++ )); do 
    printf "%s = %s\n" "$i" "${list[i]}"; 
done

for (( i=0; i<${#list[@]}; i++ )); do 
    if [[ ${list[i]} == $var1 || ${list[i]} == $var2 ]]; then
        list=( "${list[@]:0:$i}" "${list[@]:$((i + 1))}" )
        i=$((i - 1))
    fi
done

printf "\n%s\n" "After:"
for (( i=0; i<${#list[@]}; i++ )); do 
    printf "%s = %s\n" "$i" "${list[i]}"; 
done

此脚本输出

Before:
0 = one
1 = two
2 = three
3 = four
4 = five

After:
0 = one
1 = three
2 = five

该脚本的关键部分是:

list=( "${list[@]:0:$i}" "${list[@]:$((i + 1))}" )

这里我们通过指定索引和长度来重新构造现有数组,以完全从数组中删除元素并重新排序索引.

相关文章

普通模式 >G 增加当前行到文档末尾处的缩紧层级 $ 移动到本行的末尾 . 相当于一个...
原文连接: https://spacevim.org/cn/layers/lang/elixir/ 模块简介 功能特性 启用模块 快捷键 语言专属...
原文连接: https://spacevim.org/cn/layers/lang/dart/ 模块简介 功能特性 依赖安装及启用模块 启用模...
 =   赋值操作符,可以用于算术和字符串赋值 +        加法计算     -        减法运算...
1.根据包名来查看指定的APP指定数据 adb shell "top | grep com.xxx.xxx" 由于这样打印出来的数...
ctrl+F 向下翻页 ctrl+B 向下翻页 u 取消最近一次操作 U 取消当前行的操作 ZZ 保存当前内容并退出 gg 跳...