数组 – 按内容(存储在变量中)从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 /}”)也没有区别. 我还看到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 "%sn" "Before:" for (( i=0; i<${#list[@]}; i++ )); do printf "%s = %sn" "$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%sn" "After:" for (( i=0; i<${#list[@]}; i++ )); do printf "%s = %sn" "$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))}" ) 这里我们通过指定索引和长度来重新构造现有数组,以完全从数组中删除元素并重新排序索引. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |