次のコードを使用して最初に配列を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文にあると思います。関数を使用する場合は、角かっこが必要ないようです。これを見てください:
私はあなたがこれをしたいと思います:
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