매개변수를 스크립트에 전달하는 방법은 무엇입니까?

매개변수를 스크립트에 전달하는 방법은 무엇입니까?

이 스크립트에 인수를 전달하려고 하는데 작동하지 않습니다. 이 문제를 해결하는 방법을 아는 사람이 있습니까? 인수를 사용하고 싶지 않습니다. 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 233, 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

관련 정보