パラメータをスクリプトに渡すには?

パラメータをスクリプトに渡すには?

このスクリプトに引数を渡そうとしても機能しません。この問題を解決する方法を知っている人はいますか?引数を使用したくありません。 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

関連情報