1

我用这个函数在数组中查找值有一段时间,但我想改进它:

 # 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

 }

我现在认为对“参数重命名以提高可读性”数组的分配HAYSTACK效率低下,特别是对于“搜索”功能,可能会这样运行多次:

my_function_is_value_in coconut cherry coriander coconut cottage-cheese

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

perl与's比较/对比grep( /pattern/ @array).. 这是一个专门的功能来做到这一点。

4

2 回答 2

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不需要以这种方式复制参数数组。那应该加快速度。

于 2013-04-01T02:05:37.580 回答
0

似乎比显式循环更快:

my_function_is_value_in ()
{
  [[ "${@:2}" =~ "$1" ]] && return 0 || return 1
} 
于 2013-04-01T16:25:20.000 回答