你可以:if [[ " ${arr[*]} " == *" d "* ]]; then
echo "arr contains d"
fi
这将给出误报,例如,如果您查找“a b”--该子字符串在连接的字符串中,但不作为数组元素。无论您选择什么分隔符,都会出现这种困境。
最安全的方法是循环遍历数组,直到找到元素:array_contains () {
local seeking=$1; shift
local in=1
for element; do
if [[ $element == "$seeking" ]]; then
in=0
break
fi
done
return $in
}
arr=(a b c "d e" f g)
array_contains "a b" "${arr[@]}" && echo yes || echo no # no
array_contains "d e" "${arr[@]}" && echo yes || echo no # yes
这里有一个“cleaner”版本,您只需传递数组名,而不是它的所有元素array_contains2 () {
local array="$1[@]"
local seeking=$2
local in=1
for element in "${!array}"; do
if [[ $element == "$seeking" ]]; then
in=0
break
fi
done
return $in
}
array_contains2 arr "a b" && echo yes || echo no # no
array_contains2 arr "d e" && echo yes || echo no # yes
对于关联数组,有一种非常简洁的方法来测试数组是否包含给定的键:运算符-v$ declare -A arr=( [foo]=bar [baz]=qux )
$ [[ -v arr[foo] ]] && echo yes || echo no
yes
$ [[ -v arr[bar] ]] && echo yes || echo no
no