为了账号安全,请及时绑定邮箱和手机立即绑定

检查Bash数组是否包含值

检查Bash数组是否包含值

莫回无 2019-07-16 14:52:18
检查Bash数组是否包含值在Bash中,最简单的测试数组是否包含某个值的方法是什么?编辑*在答案和评论的帮助下,经过一些测试,我得出如下结论:function contains() {     local n=$#     local value=${!n}     for ((i=1;i < $#;i++)) {         if [ "${!i}" == "${value}" ]; then             echo "y"             return 0         fi     }     echo "n"     return 1}A=("one" "two" "three four")if [ $(contains "${A[@]}" "one") == "y" ]; then     echo "contains one"fiif [ $(contains "${A[@]}" "three") == "y" ]; then     echo "contains three"fi我不确定这是否是最好的解决方案,但似乎有效。
查看完整描述

3 回答

?
波斯汪

TA贡献1811条经验 获得超4个赞

的确有示例代码,演示如何替换数组中的子字符串。..可以复制数组并尝试从副本中移除目标值。如果副本和原件是不同的,那么目标值就存在于原始字符串中。

简单(但可能更耗时)解决方案是简单地遍历整个数组并单独检查每个项。这是我通常所做的,因为它很容易实现,并且您可以将它包装在一个函数中(请参阅将数组传递给函数的信息).


查看完整回答
反对 回复 2019-07-16
?
HUWWW

TA贡献1874条经验 获得超12个赞

下面是实现这一目标的一个小功能。搜索字符串是第一个参数,其余的是数组元素:


containsElement () {

  local e match="$1"

  shift

  for e; do [[ "$e" == "$match" ]] && return 0; done

  return 1

}

该函数的测试运行如下所示:


$ array=("something to search for" "a string" "test2000")

$ containsElement "a string" "${array[@]}"

$ echo $?

0

$ containsElement "blaha" "${array[@]}"

$ echo $?

1


查看完整回答
反对 回复 2019-07-16
?
largeQ

TA贡献2039条经验 获得超7个赞

这种方法的优点是不需要循环所有元素(至少不是显式的)。但既然array_to_string_internal()在……里面array.c仍然循环数组元素并将它们连接成一个字符串,它可能并不比所建议的循环解决方案更有效,但它更易读。

if [[ " ${array[@]} " =~ " ${value} " ]]; then
    # whatever you want to do when arr contains valuefiif [[ ! " ${array[@]} " =~ " ${value} " ]]; then
    # whatever you want to do when arr doesn't contain valuefi

请注意,如果您正在搜索的值是数组元素中带有空格的单词之一,则它将给出假阳性。例如

array=("Jack Brown")value="Jack"

霸王龙会看到Jack即使它不在数组中,所以你必须改变IFS和regex上的分隔符(如果您还想使用此解决方案),如下所示

IFS=$'\t'array=("Jack Brown\tJack Smith")unset IFS

value="Jack Smith"if [[ "\t${array[@]}\t" =~ "\t${value}\t" ]]; then
    echo "yep, it's there"fi


查看完整回答
反对 回复 2019-07-16
  • 3 回答
  • 0 关注
  • 1409 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信