3

我正在使用此代码检查一个 $var 是否存在于数组中:

 if echo ${myArr[@]} | grep -qw $myVar; then echo "Var exists on array" fi

我如何将多个 $vars 合并到我的支票中?类似 grep -qw $var1,$var2; 然后...菲

先感谢您。

4

3 回答 3

1
if echo ${myArr[@]} | grep -qw -e "$myVar" -e "$otherVar"
then 
  echo "Var exists on array"
fi

从手册页:

-e PATTERN, --regexp=PATTERN 使用 PATTERN 作为模式。这可用于指定多个搜索模式,或保护以连字符 (-) 开头的模式。(-e 由 POSIX 指定。)

但是如果你想使用这样的数组,你不妨使用 bash 内置的关联数组

实现和逻辑:

myVar1=home1
myVar2=home2

myArr[0]=home1
myArr[1]=home2
if echo ${myArr[@]} | grep -qw -e "$myVar1.*$myVar2" -e "$myVar2.*$myVar1"
then 
          echo "Var exists on array"
fi

# using associative arrays

declare -A assoc
assoc[home1]=1
assoc[home2]=1

if [[ ${assoc[$myVar1]} && ${assoc[$myVar2]} ]]; then
  echo "Var exists on array"
fi
于 2013-03-17T11:13:06.203 回答
1

实际上你不需要grep这个,Bash 完全有能力做扩展正则表达式本身(Bash 3.0 或更高版本)。

pattern="$var1|$var2|$var3"

for element in "${myArr[@]}"
do
    if [[ $element =~ $pattern ]]
    then
        echo "$pattern exists in array"
        break
    fi
done
于 2013-03-17T12:03:35.147 回答
0

一些二次的,但知道空间:

myArr=(aa "bb c" ddd)

has_values(){ 
  for e in "${myArr[@]}" ; do
    for f ; do
      if [ "$e" = "$f" ]; then return 0 ; fi
    done
  done 
  return 1
}

if has_values "ee" "bb  c" ; then echo yes ; else echo "no" ; fi

这个例子将打印 no 因为"bb c" != "bb c"

于 2013-03-17T11:59:38.747 回答