Você só informou getopts
que -y
tem um argumento. Você também está perdendo o "do" do comando "while".
Você também não precisa verificar se o número de args é 3 mais - na verdade, não haverá 3 args, haverá 6. Mas a contagem de argumentos é o método errado para usar com getopts. Em vez disso, verifique se todas as variáveis necessárias têm um valor.
Tente
#! /bin/sh
usage() {
echo "Usage:"
echo " $0 -i rate -a amount -y period"
exit 1
}
i='' ; a='' ; y=''
while getopts i:a:y: name ; do
case $name in
i) i="$OPTARG" ;;
a) a="$OPTARG" ;;
y) y="$OPTARG" ;;
*) usage ;;
esac
done
shift $(( OPTIND - 1 ))
if [ -z "$i" ] || [ -z "$a" ] || [ -z "$y" ] ; then
usage
fi
# Compute the monthly payment
x=$(echo "scale=20;1+$i/200" | bc)
z=$(echo "scale=20;1/6" | bc)
x2z=$(echo "scale=20;e($z*l($x))" | bc -l)
y12=$(echo "scale=20;-$y*12" | bc)
x2z2y12=$(echo "scale=20;e($y12*l($x2z))" | bc -l)
p=$(echo "scale=3;$a*(($x2z-1))/(1-$x2z2y12)" | bc)
# Print the monthly payment
echo $p
exit 0