이 스크립트에 인수를 전달하려고 하는데 작동하지 않습니다. 이 문제를 해결하는 방법을 아는 사람이 있습니까? 인수를 사용하고 싶지 않습니다. getopts를 사용하고 싶습니다.
이 부분에 대해서는
# Get command line parameters
i=
a=
y=
while getopts iay: name
case $name in
i) i="$OPTARG" ;;
a) a="$OPTARG" ;;
y) y="$OPTARG" ;;
?) exit;;
esac
done
이게 스크립트야
if [ $# -ne 3 ]
then
echo -e "\nUsage: mortgage rate amount period\n"
exit 1
fi
# Get command line parameters
i=
a=
y=
while getopts iay: name
case $name in
i) i="$OPTARG" ;;
a) a="$OPTARG" ;;
y) y="$OPTARG" ;;
?) exit;;
esac
done
# 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
========================== 원본 스크립트는 다음과 같습니다.
if [ $# -ne 3 ] then echo -e "\nUsage: mortgage rate amount period\n" exit 1 fi
Get command line parameters
i=$1; a=$2; y=$3
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
답변1
쉘 스크립트의 매개변수는 $1, $2, $3 등뿐입니다. 예를 들어 script.sh 파일에 echo $2; echo $1을 입력하여 실행 가능하게 만든 다음 ./script.sh one-two로 실행합니다.
귀하의 스크립트에서;
i=$1
a=$2
y=$3
이제 i 는 ./myscript.sh 3 4 23
3, a는 4, y는 23입니다.
답변2
당신은 단지 논쟁이 getopts
있다고 말하고 있습니다. -y
또한 "while" 명령에 "do"가 누락되었습니다.
또한 더 이상 인수 수가 3인지 확인할 필요가 없습니다. 실제로 인수는 3개가 아니라 6개입니다. 그러나 인수 계산은 getopts와 함께 사용하는 잘못된 방법입니다. 대신 필요한 변수에 모두 값이 있는지 확인하세요.
노력하다
#! /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
답변3
도와주신 모든 분들을 생각하며 드디어 답을 찾았습니다
코드는 다음과 같습니다.
# Use “getopts” to give options to the script
while getopts "i:a:y:" option; do
case $option in
i)
i=$OPTARG
;;
a)
a=$OPTARG
;;
y)
y=$OPTARG
;;
\?)
echo -e "\nUsage: mortgage rate amount period\n"
exit 1
;;
esac
done
# 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 “Your Monthly is $p”
exit 0