Como passar argumentos em scripts?

2

Eu estou tentando passar arg para esses scripts, mas não funciona alguém sabe como corrigir isso? e eu não quero usar args eu quero usar getopts

Para esta parte

# 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

Estes são os scripts

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

========================== Estes são scripts originais:

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
    
por Siavosh Bahman 16.10.2015 / 02:04

3 respostas

2

Os argumentos de um script de shell são apenas $ 1, $ 2, $ 3 e assim por diante. Por exemplo, coloque echo $ 2; echo $ 1 em um arquivo script.sh, torne-o executável e execute-o como ./script.sh um dois.

no seu script;

i=$1

a=$2

y=$3

e execute-o como ./myscript.sh 3 4 23 . Agora eu serei 3, a será 4 e y será 23.

    
por 16.10.2015 / 02:34
2

Você só informou getopts que -y tem um argumento. Você também está perdendo o "do" do comando "while".

Você também não precisa verificar se o número de args é 3 mais - na verdade, não haverá 3 args, haverá 6. Mas a contagem de argumentos é o método errado para usar com getopts. Em vez disso, verifique se todas as variáveis necessárias têm um valor.

Tente

#! /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
    
por 16.10.2015 / 02:39
1

Finalmente, eu encontro a resposta para todos que ajudaram

este é o código:

# 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
    
por 17.10.2015 / 05:05

Tags