2016-04-16 6 views
0

Angenommen habe ich eine KSH Funktion, die die Summe seiner Argumente zurück, aber wenn die Argumente nicht geliefert werden, fordert es für Benutzereingaben:Wie KSH Funktion Rückkehr machen nur einige Echomeldung

#!/bin/ksh 
sum() { 
    typeset v1=$1 
    typeset v2=$2 

    test -z "$v1" && { printf "please enter v1: "; read v1; } 
    test -z "$v2" && { printf "please enter v2: "; read v2; } 

    echo $((v1+v2)) 
} 

würde ich wie das Ergebnis dieser Funktion einer variablen zugewiesen werden, normalerweise würde ich es wie folgt

typeset result=`sum 3 4` 
echo $result # 7 

Aber wenn ich die Aufforderung Version

typeset result=`sum` 
echo $result 

Es hat 2 unerwünschte Wirkung: erstens werden die Promptnachrichten please enter ... nicht angezeigt, zweitens wird die result den Text please enter ... statt nur Zahl enthalten.

$ typeset result=`sum` 
$ 1 
$ 2 
$ echo $result 
please enter v1: please enter v2: 3 

Wie kann ich die Funktion bearbeiten sum so dass, wenn keine Argumente angegeben, sie die Aufforderungsmeldungen please enter ... drucken statt nach stdout zurückkehr es die die result Variable?

Antwort

1

Zuerst muss ich sagen, dass die Aufforderung zur Eingabe in der Mitte einer Funktion wie diese eine schreckliche Idee ist. Aber wenn du gehst, es zu tun, können Sie entweder drucken Sie den Anweisungen auf stderr oder/dev/tty

sum() { 
    typeset v1=$1 
    typeset v2=$2 

    test -z "$v1" && { printf "please enter v1: " >&2; read v1; } 
    test -z "$v2" && { printf "please enter v2: " > /dev/tty; read v2; } 

    echo $((v1+v2)) 
} 

Oder verwenden read -p die Aufforderung zu stderr lesen Druck zu haben. (das ist test -z "$v1" && read -p "Please enter v1: " v1)

+0

Ihre Worte treffen mich. Ich habe schon erfahren, warum es schrecklich ist; Sie müssen in der meisten Zeile des Codes berücksichtigen, ob es Eingaben anfordern kann. Ich behalte also Ihren Vorschlag und versuche das Programm so zu refaktorieren, dass nur in Portalfunktionen Eingaben angefordert werden. – asinkxcoswt