Вы только сказали getopts
, что -y
имеет аргумент. Вы также пропустили "do" из команды "while".
Вам также больше не нужно проверять, что количество аргументов равно 3 - на самом деле, аргументов будет не 3, а 6. Но подсчет аргументов - это неправильный метод для использования с getopts. Вместо этого проверьте, что все ваши необходимые переменные имеют значение.
Try
#! /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