Я не думаю, что с вашим методом что-то не так, хотя я бы сказал, что писать его довольно долго.
Поскольку вы используете bash, вы можете использовать расширенный глоб, который уменьшаетдлина вашего кода значительно:
# enable extended globs
shopt -s extglob
# match anything containing car, bus, truck or vehicle
if [[ $str = *@(car|bus|truck|vehicle)* ]]; then
echo "Substring found"
fi
# unset extended glob mode
shopt -u extglob