Bashで配列の要素を見つける

Bashで配列の要素を見つける

次のコードを使用して最初に配列を2つの配列に分割し、次に両方の分割配列で「Alchemist」と「Axe」という2つの要素があるかどうかを検索します。

tempifs=$IFS
    IFS=,
    match=($i)
    IFS=$tempifs
    team1=( "${match[@]:0:5}" )
    team2=( "${match[@]:5:5}" )
        if [ array_contains2 $team1 "Alchemist" "Axe" ]
    then
    echo "team1 contains"
        fi
    if [ array_contains2 $team2 "Alchemist" "Axe" ]
    then
    echo "team2 contains"
        fi  

array_contains2 () { 
    local array="$1[@]"
    local seeking=$2
    local seeking1=$3
    local in=0
    for element in "${array[@]}"; do
        if [[ $element == $seeking && $element == $seeking1]]
    then
            in=1
            break
        fi
    done
    return $in
}

ただし、次のエラーが発生します。

/home/ashwin/bin/re: line 18: [: Alchemist: binary operator expected
/home/ashwin/bin/re: line 14: [: too many arguments

14行と18行はそれぞれif [ array_contains2 $team1 "Alchemist" "Axe" ]とですif [ array_contains2 $team2 "Alchemist" "Axe" ]

IFSエラーが原因です。そうでない場合、エラーの原因は何ですか?

答え1

問題はif文にあると思います。関数を使用する場合は、角かっこが必要ないようです。これを見てください:

https://stackoverflow.com/questions/8117822/in-bash-can-you-use-a-function-call-as-a-condition-in-an-if-statement

私はあなたがこれをしたいと思います:

if array_contains2 $team1 "Alchemist" "Axe"; then
    echo "This is true"
fi

答え2

すでに関数を使用していますが、なぜシェル配列の代わりにbash配列のみを使用するように制限しますか$@

bash_array=(one two three)
set -- $bash_array
printf %s\\n "$@"
    #output
one
two
three

IFS=/ ; echo "$*" ; echo "$@"
    #output 
/one/two/three
one two three

unset IFS ; in=$* ; 

[ -n "${in#"${in%$2*}"}" ] && echo "$2 is in $@" || echo nope
    #output
two is in one two three

関連情報