【发布时间】:2021-02-24 05:46:36
【问题描述】:
我的 bash 数组(下面称为 tenantlist_array)填充了以下格式的元素:
{3 characters}-{3-5 characters}{3-5 digits}-{2 chars}{1-2 digits}.
例子:
abc-hac101-bb0
xyz-b2blo97250-aa99
abc-b2b9912-xy00
fff-hac101-g3
数组元素是唯一的。请注意连字符,它是每个数组元素的一部分。
我需要检查提供的字符串(在下面的示例中用作变量tenant)是否产生与任何数组元素的完全匹配 - 因为数组元素是唯一的,所以第一个匹配就足够了。
我正在使用简单的代码迭代数组元素:
tenant="$1"
for k in "${tenantlist_array[@]}"; do
result=$(grep -x -- "$tenant" <<<"$k")
if [[ $result ]]; then
break
fi
done
请注意 - 我需要一个完整的字符串匹配 - 例如,如果我正在搜索的字符串是 hac101 它不得匹配任何数组元素,即使它可以是子字符串一个数组元素。
换句话说,只有完整的字符串abc-hac101-bb0 必须产生与第一个元素的匹配。字符串abc、abc-hac、b2b、99、- 不得产生匹配项。这就是 -x 参数与 grep 调用一起使用的原因。
现在,上面的代码可以工作了,但我发现它很慢。我使用具有 193 个元素的数组运行它,在普通笔记本上,遍历数组元素需要将近 90 秒:
real 1m2.541s
user 0m0.500s
sys 0m24.063s
数组中有 385 个元素,时间如下:
real 2m8.618s
user 0m0.906s
sys 0m48.094s
所以我的问题 - 有更快的方法吗?
【问题讨论】:
-
如果你需要一个完整的字符串匹配,那么你不需要使用正则表达式(即使你这样做了,你也不需要产生一个子shell/使用 grep)。您应该能够简单地测试相等
if [[ "$1" = "$k" ]]; then ... -
@arco444 你是对的!问题 - 您是否看到任何潜在的缺点?
-
不,我没有看到任何缺点 - 该操作实际上就是为此目的!
标签: arrays string bash search grep