我试图将 arg 传递给这个脚本,但它不起作用,有人知道如何解决这个问题吗?我不想使用 args 我想使用 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
shell 脚本的参数只有 $1、$2、$3 等等。例如,输入 echo $2; echo $1 在 script.sh 文件中,使其可执行,然后以 ./script.sh 一二的方式运行。
在你的脚本中;
i=$1
a=$2
y=$3
并将其运行为./myscript.sh 3 4 23
.现在 i 是 3,a 是 4,y 是 23。
答案2
你只是说getopts
有-y
一个论点。您还缺少“while”命令中的“do”。
您也不需要再检查 args 的数量是否为 3 - 事实上,不会有 3 个 args,而是 6 个。但是 arg 计数是与 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