あなたができること:
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
これは、すべての要素ではなく、配列名を渡すだけの「よりクリーンな」バージョンです。
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
マニュアルの6.4Bash条件式を参照してください。