expr $1 % 3 = 0
возвращает 1 или 0, в зависимости от того, равен ли результат $1 % 3
нулю или нет, но if
рассматривает 0 как истину, а не ложь.
sh-3.2$ if [ 0 ]; then echo ok; fi
ok
Таким образом, вы бынужно сравнить вывод вашей функции с 1. Примерно так:
#!/usr/bin/env sh
div3() {
expr $1 % 3 = 0
}
div5() {
expr $1 % 5 = 0
}
fizzy() {
if [ $(div3 $1) -eq 1 ] && [ $(div5 $1) -eq 1 ]; then
expr "FizzBuzz"
elif [ $(div3 $1) -eq 1 ]; then
expr "Fizz"
elif [ $(div5 $1) -eq 1 ]; then
expr "Buzz"
else
expr "$1"
fi
}
for (( i = 1; i <= 15; i++ ))
do
echo $(fizzy $i)
done