Bash で、配列に特定の値が含まれているかどうかをテストする最も簡単な方法は何ですか?
ベストアンサー1
このアプローチには、すべての要素をループする必要がないという利点があります(少なくとも明示的には)。しかしarray_to_string_internal()
、配列.c配列要素をループして文字列に連結するので、提案されているループソリューションよりも効率的ではないかもしれませんが、読みやすくなります。
if [[ " ${array[*]} " =~ [[:space:]]${value}[[:space:]] ]]; then
# whatever you want to do when array contains value
fi
if [[ ! " ${array[*]} " =~ [[:space:]]${value}[[:space:]] ]]; then
# whatever you want to do when array doesn't contain value
fi
検索する値がスペースを含む配列要素内の単語の1つである場合、誤検出が発生することに注意してください。たとえば、
array=("Jack Brown")
value="Jack"
正規表現では、実際には配列内に存在しない「Jack」が配列内に存在すると認識されます。したがって、IFS
このソリューションを引き続き使用したい場合は、次のように正規表現の区切り文字を変更する必要があります。
IFS="|"
array=("Jack Brown${IFS}Jack Smith")
value="Jack"
if [[ "${IFS}${array[*]}${IFS}" =~ "${IFS}${value}${IFS}" ]]; then
echo "true"
else
echo "false"
fi
unset IFS # or set back to original IFS if previously set
これは「false」を出力します。
明らかに、これはテスト ステートメントとしても使用でき、ワンライナーとして表現できます。
[[ " ${array[*]} " =~ " ${value} " ]] && echo "true" || echo "false"
このソリューションは配列をチェックするために正規表現に依存しているため、ニードル内の正規表現文字をエスケープする必要があります。たとえば、次のように検索する場合です。
array=("valueToBeFound")
value=".*"
value
に設定する必要があります\.\*
。そうしないと、すべての配列要素が一致すると見なされます。