猿问

检查Bash数组是否包含值

检查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

我不确定这是否是最好的解决方案,但似乎有效。


莫回无
浏览 1410回答 3
3回答

波斯汪

的确有示例代码,演示如何替换数组中的子字符串。..可以复制数组并尝试从副本中移除目标值。如果副本和原件是不同的,那么目标值就存在于原始字符串中。简单(但可能更耗时)解决方案是简单地遍历整个数组并单独检查每个项。这是我通常所做的,因为它很容易实现,并且您可以将它包装在一个函数中(请参阅将数组传递给函数的信息).

HUWWW

下面是实现这一目标的一个小功能。搜索字符串是第一个参数,其余的是数组元素:containsElement () {&nbsp; local e match="$1"&nbsp; shift&nbsp; for e; do [[ "$e" == "$match" ]] && return 0; done&nbsp; return 1}该函数的测试运行如下所示:$ array=("something to search for" "a string" "test2000")$ containsElement "a string" "${array[@]}"$ echo $?0$ containsElement "blaha" "${array[@]}"$ echo $?1

largeQ

这种方法的优点是不需要循环所有元素(至少不是显式的)。但既然array_to_string_internal()在……里面array.c仍然循环数组元素并将它们连接成一个字符串,它可能并不比所建议的循环解决方案更有效,但它更易读。if&nbsp;[[&nbsp;"&nbsp;${array[@]}&nbsp;"&nbsp;=~&nbsp;"&nbsp;${value}&nbsp;"&nbsp;]];&nbsp;then &nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;whatever&nbsp;you&nbsp;want&nbsp;to&nbsp;do&nbsp;when&nbsp;arr&nbsp;contains&nbsp;valuefiif&nbsp;[[&nbsp;!&nbsp;"&nbsp;${array[@]}&nbsp;"&nbsp;=~&nbsp;"&nbsp;${value}&nbsp;"&nbsp;]];&nbsp;then &nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;whatever&nbsp;you&nbsp;want&nbsp;to&nbsp;do&nbsp;when&nbsp;arr&nbsp;doesn't&nbsp;contain&nbsp;valuefi请注意,如果您正在搜索的值是数组元素中带有空格的单词之一,则它将给出假阳性。例如array=("Jack&nbsp;Brown")value="Jack"霸王龙会看到Jack即使它不在数组中,所以你必须改变IFS和regex上的分隔符(如果您还想使用此解决方案),如下所示IFS=$'\t'array=("Jack&nbsp;Brown\tJack&nbsp;Smith")unset&nbsp;IFS value="Jack&nbsp;Smith"if&nbsp;[[&nbsp;"\t${array[@]}\t"&nbsp;=~&nbsp;"\t${value}\t"&nbsp;]];&nbsp;then &nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"yep,&nbsp;it's&nbsp;there"fi
随时随地看视频慕课网APP
我要回答