1. ホーム
  2. arrays

[解決済み] Bashの配列に要素があるかどうかをチェックする [重複]。

2023-08-17 03:20:09

質問

私は、Bashで配列内に要素が存在するかどうかをチェックする効率的な方法があるかどうか疑問に思っていました。私は、Pythonでできることと似たようなものを探しています。

arr = ['a','b','c','d']

if 'd' in arr:
    do your thing
else:
    do something

Bash 4+でbash用の連想配列を使った解決策を見たことがありますが、他に解決策があるのか気になります。

私が知っている些細な解決策は、配列の中で反復することですが、私はそれを望んでいないことを理解してください。

どのように解決するのですか?

できます。

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.4 Bashの条件式 を参照してください。