我试图编写一个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"。
这里缺少什么以及我应该如何正确地写出来?
答案 0 :(得分:3)
=~
是一个无固定的正则表达式 - 当引用右侧时,它变为子字符串搜索。 ${array[*]}
通过将数组中的所有条目与IFS
中的第一个字符(默认情况下为空格)组合在一起来组装字符串。因此,[[ ${array[*]} =~ "$var" ]]
将您的数组展平为一个字符串,并对该字符串进行子字符串搜索。
site.com
是my.site.com
和site.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