阅读您的帖子,我认为您不仅想知道数组中是否存在字符串(如标题所示),还想知道该字符串是否实际上对应于该数组的元素。如果是这种情况,请继续阅读。
我找到了一种似乎可以正常工作的方法。
如果您像我一样使用 bash 3.2(但也在 bash 4.2 中测试和工作),这很有用:
array=('hello' 'world' 'my' 'name' 'is' 'perseus')
IFS=: # We set IFS to a character we are confident our
# elements won't contain (colon in this case)
test=:henry: # We wrap the pattern in the same character
# Then we test it:
# Note the array in the test is double quoted, * is used (@ is not good here) AND
# it's wrapped in the boundary character I set IFS to earlier:
[[ ":${array[*]}:" =~ $test ]] && echo "found! :)" || echo "not found :("
not found :( # Great! this is the expected result
test=:perseus: # We do the same for an element that exists
[[ ":${array[*]}:" =~ $test ]] && echo "found! :)" || echo "not found :("
found! :) # Great! this is the expected result
array[5]="perseus smith" # For another test we change the element to an
# element with spaces, containing the original pattern.
test=:perseus:
[[ ":${array[*]}:" =~ $test ]] && echo "found!" || echo "not found :("
not found :( # Great! this is the expected result
unset IFS # Remember to unset IFS to revert it to its default value
让我解释一下:
此解决方法基于"${array[*]}"
(注意双引号和星号)扩展到由 IFS 的第一个字符分隔的数组元素列表的原理。
因此,我们必须将 IFS 设置为我们想要用作边界的任何内容(在我的例子中是冒号):
IFS=:
然后我们将我们正在寻找的元素包装在同一个字符中:
test=:henry:
最后我们在数组中寻找它。请注意我在进行测试时遵循的规则(它们都是强制性的):数组是双引号,使用 *(@ 不好)并且它包含在我之前设置 IFS 的边界字符中:
[[ ":${array[*]}:" =~ $test ]] && echo found || echo "not found :("
not found :(
如果我们寻找一个存在的元素:
test=:perseus:
[[ ":${array[*]}:" =~ $test ]] && echo "found! :)" || echo "not found :("
found! :)
对于另一个测试,我们可以将最后一个元素 'perseus' 更改为 'perseus smith'(带空格的元素),只是为了检查它是否匹配(不应该):
array[5]="perseus smith"
test=:perseus:
[[ ":${array[*]}:" =~ $test ]] && echo "found!" || echo "not found :("
not found :(
太好了!这是预期的结果,因为“英仙座”本身不再是一个元素。
重要提示!:完成测试后,请记住取消设置 IFS 以将其恢复为默认值(未设置):
unset IFS
到目前为止,这种方法似乎有效,您只需要小心并为 IFS 选择一个您确定您的元素不会包含的字符。
希望它可以帮助任何人!
问候,弗雷德