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