Bem, operações de array no bash são sempre feias, como mostrado pelo seu próprio jeito de passar o array para a função.
Eu converteria seu teste em um loop for sobre os argumentos que permanecem após a atribuição da matriz:
in_array () {
local somearray=${1}[@]
shift
for SEARCH_VALUE in "$@"; do
FOUND=false
for ARRAY_VALUE in ${!somearray}; do
if [[ $ARRAY_VALUE == $SEARCH_VALUE ]]; then
FOUND=true
break
fi
done
if ! $FOUND; then
return 1
fi
done
return 0
}
para que você possa verificar a presença de todos os valores em uma única chamada de função:
arr=(1 2 3 4 5)
in_array arr 1 # 0
in_array arr 1 2 # 0
in_array arr 1 6 # 1
in_array arr 1 2 3 4 5 # 0