如何将参数传递到脚本中?

如何将参数传递到脚本中?

我试图将 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

相关内容