【发布时间】:2014-06-21 04:30:40
【问题描述】:
我在 bash 脚本中有一个数组 list,还有一个变量 var。我知道$var 出现在${list[@]} 中,但没有简单的方法来确定它的索引。我想从list 中删除它。
This answer 实现了非常接近我需要的东西,除了 list 在 $var 曾经所在的位置保留了一个空元素。注意,例如:
$ list=(one two three)
$ var="two"
$ list=( "${list[@]/$var}" )
$ echo ${list[@]}
one three
$ echo ${#list[@]}
3
如果我在第三行使用delete=( "$var" ) 并用$delete 替换$var,也会发生同样的事情。此外,做list=( "${list[@]/$var/}" ) 也没有区别。
(我会注意到,在尝试对该答案的评论时,我设法使用list=( "${list[@]/%$var}" ) 仅匹配整个单词,省略了#。)
我还看到this 的回答提出了一个很好的技巧来跟踪索引并使用unset,但这在我的情况下是不可行的。最后,同样的问题也出现了here,除了 OP 对结果感到满意,并且可能没有遇到稍后在我的脚本中为我创建的空元素问题,当我遍历 list 时。我试图通过使用以下扩展来否定这个问题,但没有任何明显的效果:
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!
我不确定是否可以在脚本中省略引号,因为那里的项目要复杂得多(文件名和路径,都包含空格和奇数字符)。
【问题讨论】:
-
关于您的编辑,我无法复制它。两次运行我都得到了三个
Here!实例。 -
@JS웃 很奇怪。它在我的机器上完全可以重现(运行可靠)。
-
您的编辑在第二种情况下获得两个实例的原因是列表
("one" "" "three")被 shell 扩展为for item in one three而不是for item in "one" "" "three" -
@JoshuaGoldberg 你有没有注意到这个问题是我提供的第一个链接,然后解释了为什么它还不够? (也就是说,空元素。)
-
@JonathanY.,我很抱歉,我确实错过了......虽然它可能更多地限制了那里的大部分答案,而不是问题。 (我在那里发布了一个有点老套的答案,并没有碰巧留下空白位置。)对于寻找标记 dup 的答案或只是保持链接的人们是否会更有帮助,我持观望态度。