Bash在数组中查找值

时间:2013-04-01 01:44:08

标签: bash

我使用此函数暂时在数组中查找值,但我想改进它:

 # Checks if the first argument is found in the subsequent ones.

 function my_function_is_value_in() {

   local -r NEEDLE=$1
   local -ra HAYSTACK=( "${@:2}" )

   local value
   for value in "${HAYSTACK[@]}"; do
     [[ $value == "$NEEDLE" ]] && return 0
   done

   return 1

 }

我现在认为对#34;参数的赋值是为了便于阅读"数组HAYSTACK效率低下,特别是对于"搜索"功能,可能会多次运行:

my_function_is_value_in coconut cherry coriander coconut cottage-cheese

Bash是否有一种有效的方法来执行上述操作,或者直接循环遍历${@:2}并尽可能高效地进行循环?

perl' s grep( /pattern/ @array)进行比较/对比..这是一个专门执行此功能的功能。

2 个答案:

答案 0 :(得分:1)

你可能会从中获得更好的结果,但我没有做任何测量来证明这两种方式:

function my_function_is_value_in()
{
    local -r NEEDLE=$1
    shift
    local value
    for value in "$@"
    do
        [[ $value == "$NEEDLE" ]] && return 0
    done
    return 1
}

我们的想法是shell不需要以这种方式复制参数数组;应该加快速度。

答案 1 :(得分:0)

似乎比显式循环更快:

my_function_is_value_in ()
{
  [[ "${@:2}" =~ "$1" ]] && return 0 || return 1
}