Open6

シェルスクリプトで「配列に値が含まれているかどうか」確認したい

log5log5

100万回は車輪の再開発が行われてそうだけども

log5log5

macOS 10.15.7 Catalina で sh test.sh を実行して確認

array=('apple' 'orange' 'banana' 'peach')

echo ${array[@]} | xargs -n 1 | grep -E "^orange$" > /dev/null
if [ $? -eq 0 ]; then
    echo "Orange exists."
else
    echo "Orange does not exist."
fi

これはOK
一方で関数にしようとするとうまくいかない

function check_array() {
    arr=$2
    echo ${arr[@]} | xargs -n 1 | grep -E "^${1}$" > /dev/null
    return $?
}

array=('apple' 'orange' 'banana' 'peach')

if [ $(check_array "orange" $array) ]; then
    echo "Orange exists."
else
    echo "Orange does not exist."
fi

ただ、関数の書式とかが違っている気がする

epsilon phoenixepsilon phoenix
function check_array() {
    arr=$2
    echo ${arr[@]} | xargs -n 1 | grep -E "^${1}$"
    #printf "%s\n" ${arr[@]} | grep -x "${1}"
}

array=('apple' 'orange' 'banana' 'peach')

word="peach"
if test -n "$(check_array "${word}" "${array[*]}")" ; then
    echo "${word} exists."
else
    echo "${word} does not exist."
fi
log5log5

shell の関数、ちょっと時間かけないと理解できない程度には難しい...
しばらくこのテンプレ使い回すかな...

array=('apple' 'orange' 'banana' 'peach')
echo ${array[@]} | xargs -n 1 | grep -E "^orange$" > /dev/null
if [ $? -eq 0 ]; then
    echo "Orange exists."
else
    echo "Orange does not exist."
fi
log5log5

複数条件用
なんかものすごーーくコレジャナイ感じがするけど

arrayone=('apple' 'orange' 'banana' 'peach')
echo ${arrayone[@]} | xargs -n 1 | grep -E "^orange$" > /dev/null
res1=$?

arraytwo=('foo' 'bar' 'baz')
echo ${arraytwo[@]} | xargs -n 1 | grep -E "^bar$" > /dev/null
res2=$?

if [ $res1 -eq 0 ]; then
    echo "Orange exists."
elif [ $res2 -eq 0 ]; then
    echo "bar exists."
else
    echo "Orange or bar does not exist."
fi