При использовании if [ ... ]вы фактически используете [утилиту (которая аналогична, testно требует, чтобы последний аргумент был ]).
[не понимает, чтобы запустить вашу функцию, он ожидает строки. К счастью, здесь вам вообще не нужно использовать [(по крайней мере, для этой функции):
if [ "$docheck" -eq 1 ] && notContainsElement "$fruit" "${blacklist[@]}"; then
...
fi
Обратите внимание, что я также сначала проверяю целое число, чтобы мы могли вообще не вызывать функцию, если $docheckне равен 1.
Это работает, потому что ifпринимает произвольную команду и решает, что делать из состояния выхода этой команды. Здесь мы используем [ ... ]тест вместе с вызовом вашей функции с &&промежуточным созданием составной команды. Состояние выхода составной команды будет истинным, если и [ ... ]тест, и функция вернули ноль в качестве своих состояний выхода, сигнализируя об успехе.
Как примечание стиля, у меня не было бы функционального теста, если массив не содержит элемент, но если ли содержит элемент, и затем
if [ "$docheck" -eq 1 ] && ! contains "$fruit" "${blacklist[@]}"; then ...
Имея тестовую функцию отрицательный испортит логику в тех случаях , когда вы делаете хотите проверить , содержит ли массив элемента ( if ! notContainsElement ...).