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