33
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Bash】配列に値が含まれているか確認する方法

Last updated at Posted at 2020-03-22

前提

配列arrayorangeに含まれているかどうかを判定するスクリプトです。

いくつかコードがありますが急いでいる人は結論へどうぞ

コード

array=('apple' 'orange' 'banana' 'peach')
check_array() {
    local i
    for i in ${array[@]}; do
        if [[ ${i} = ${1} ]]; then
            return 0
        fi
    done
    return 1
}

if check_array "orange"; then
    echo "Orange exists."
else
    echo "Orange does not exist."
fi

解説

check_arrayについて

forで配列の文字を1つずつ比較し、引数に渡された値と同一の値があればその時点でtrueを出力して終了します。
もしforが終了したらその時点で値が存在していないことになるのでfalseを出力して終了します。

if以降について

あとはcheck_arrayを実行して値を比較しているだけです。

もっといい方法が合った

コメントにて教えていただきました

if [[ $(printf '%s\n' "${array[@]}" | grep -qx "orange"; echo -n ${?} ) -eq 0 ]]; then
    echo "Orange exists."
else
    echo "Orange does not exist."
fi

教えてもらったコードを修正

終了コードの判定なのでこっちのほうがいいよっていう
grepのオプションを編集すれば条件を正規表現とかでいい感じにできるはず

if printf '%s\n' "${array[@]}" | grep -x "orange" > /dev/null >&2; then
    echo "Orange exists."
else
    echo "Orange does not exist."
fi

さらに修正

grepの-qオプションという存在を知ったのでもっと短くなった

if printf '%s\n' "${array[@]}" | grep -qx "orange"; then
    echo "Orange exists."
else
    echo "Orange does not exist."
fi

最後に

もしもっと良い方法があれば教えて下さい

33
18
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
33
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?