在多个数组中查找变量的完全匹配

时间:2018-06-14 15:03:27

标签: arrays bash

我试图编写一个bash代码,它应该获取一个变量并在多个数组中搜索。例如:

$var = site.com

我的阵列是:

array1=(test world myword something bla my.site.com)
array=(google facebook stackoverflow site.com)
array=(music eating video site.com.dev)

我尝试运行但不幸的是无法运行的代码是:

#!/bin/bash
if [[ ${array1[*]} =~ "$var" ]]; then
   echo "it's array1"
elif [[ ${array2[*]} =~ "$var" ]]; then 
   echo "it's array2"
elif [[ ${array3[*]} =~ "$var" ]]; then
   echo "it's array3"
fi

这里的问题是它甚至为" site.com"," my.site.com"返回相同的数组。和" site.com.dev"。

这里缺少什么以及我应该如何正确地写出来?

1 个答案:

答案 0 :(得分:3)

=~是一个无固定的正则表达式 - 当引用右侧时,它变为子字符串搜索。 ${array[*]}通过将数组中的所有条目与IFS中的第一个字符(默认情况下为空格)组合在一起来组装字符串。因此,[[ ${array[*]} =~ "$var" ]]将您的数组展平为一个字符串,并对该字符串进行子字符串搜索。

site.commy.site.comsite.com.dev的子字符串,因此它可以匹配。

如果您想要一个高效,完全匹配的搜索,请将您的数组反转为关联而不是数字索引,并为每个数组执行键查找。

那是:

#!/usr/bin/env bash
case $BASH_VERSION in ''|[123].*) echo "ERROR: Needs bash 4.0 or newer" >&2; exit 1;; esac

var=site.com

declare -A array1=( [test]=1 [world]=1 [myword]=1 [something]=1 [my.site.com]=1 )
declare -A array2=( [google]=1 [facebook]=1 [stackoverflow]=1 [site.com]=1 )
declare -A array3=( [music]=1 [eating]=1 [video]=1 [site.com.dev]=1 )

if [[ ${array1["$var"]} ]]; then echo "It's array1"
elif [[ ${array2["$var"]} ]]; then echo "It's array2"
elif [[ ${array3["$var"]} ]]; then echo "It's array3"
else echo "Not found"
fi