La dichiarazione return
utilizzata da bash
viene utilizzata per restituire un valore numerico come codice di stato da recuperare tramite $?
dalla funzione di chiamata. Non puoi restituire una stringa. Vedi anche
è possibile utilizzare una variabile globale speciale come proposto da @konsolebox, o echo
il valore di ritorno all'interno della vostra funzione e utilizzare la sostituzione di comando quando si chiama la funzione :
makeName()
{
echo "$fileName.$1.log"
}
echo -n "Enter fileName:"
read fileName
name1=$(makeName "type1")
name2=$(makeName "type2")
echo $name1
echo $name2
[UPDATE]
La domanda aggiornata mostra che si intende leggere ancora un altro valore all'interno della funzione makeName
, mentre la funzione intende anche echo
qualche richiesta per l'utente. Quindi l'approccio sostituzione di comando non funziona in questo caso - è necessario utilizzare una variabile globale, come
makeName() {
echo -n "Enter Ext: "
read ext
__="$fileName.$1.$ext.log"
}
echo -n "Enter fileName:"
read fileName
makeName "type1" ; name1=${__}
makeName "type2" ; name2=${__}
echo $name1
echo $name2
$ ./sample.sh
Enter fileName:filename
Enter Ext: ext1
Enter Ext: ext2
filename.type1.ext1.log
filename.type2.ext2.log
Eppure meglio, per il codice più pulito e di evitare l'uso di variabili globali all'interno della vostra funzione, potrebbe utilizzare l'approccio descritto in Returning Values from Bash Functions e passare il nome della variabile ritorno come parametro, e idealmente anche passare il fileName
come parametro:
makeName() {
local __type=$1
local __fileName=$2
local __resultvar=$3
local ext
local myresult
echo -n "Enter Ext: "
read ext
myresult="$__fileName.$__type.$ext.log"
eval $__resultvar="'$myresult'"
}
echo -n "Enter fileName:"
read fileName
makeName "type1" $fileName theResult ; name1=${theResult}
makeName "type2" $fileName theResult ; name2=${theResult}
echo $myresult
echo $name1
echo $name2
Nota a margine: Vedere Why should eval be avoided in Bash, and what should I use instead? per una discussione sul perché eval
deve essere evitato. Quando si utilizza bash versione 3.1 o superiore, è possibile utilizzare printf
invece di eval
:
...
printf -v "$__resultvar" '%s' "$myresult"
...
E, infine, con bash 4.3 o superiore, siamo in grado di assegnare il nameref attributo ad una variabile utilizzando declare -n
, in modo che il variabile è effettivamente un riferimento ad un'altra variabile:
...
declare -n myresult=$3
myresult="$__fileName.$__type.$ext.log"
...
Ciao Andreas, ho aggiornato la mia domanda. – Ashwin
Vedere la mia risposta aggiornata - in sostanza, hai abusato di 'return', e devi anche usare l'approccio proposto da @konsolebox quando la tua funzione intende stampare l'output su stdout (diverso dal valore restituito) –
Grazie Andreas. Funziona bene ora. :) – Ashwin