Εργάζομαι με ένα σενάριο bash και θέλω να εκτελέσω μια συνάρτηση για να εκτυπώσω μια τιμή επιστροφής:
function fun1(){
return 34
}
function fun2(){
local res=$(fun1)
echo $res
}
Όταν εκτελώ την fun2
, δεν εκτυπώνει το "34". Γιατί συμβαίνει αυτό;
Παρόλο που το bash έχει μια δήλωση return
, το μόνο πράγμα που μπορείτε να καθορίσετε με αυτήν είναι η κατάσταση exit
της συνάρτησης (μια τιμή μεταξύ 0
και 255
, 0 σημαίνει "επιτυχία"). Επομένως, το return
δεν είναι αυτό που θέλετε.
Ίσως θα θέλατε να μετατρέψετε την εντολή return
σε εντολή echo
- με αυτόν τον τρόπο η έξοδος της συνάρτησης θα μπορούσε να καταγραφεί χρησιμοποιώντας τις αγκύλες $()
, που φαίνεται να είναι ακριβώς αυτό που θέλετε.
Ακολουθεί ένα παράδειγμα:
function fun1(){
echo 34
}
function fun2(){
local res=$(fun1)
echo $res
}
Ένας άλλος τρόπος για να λάβετε την τιμή επιστροφής (αν θέλετε να επιστρέψετε απλώς έναν ακέραιο αριθμό 0-255) είναι $?
.
function fun1(){
return 34
}
function fun2(){
fun1
local res=$?
echo $res
}
Επίσης, σημειώστε ότι μπορείτε να χρησιμοποιήσετε την τιμή επιστροφής για να χρησιμοποιήσετε λογική boolean, όπως fun1 || fun2
θα εκτελέσει την fun2
μόνο αν η fun1
επιστρέψει την τιμή 0
. Η προεπιλεγμένη τιμή επιστροφής είναι η τιμή εξόδου της τελευταίας εντολής που εκτελέστηκε εντός της συνάρτησης.
$(...)
καταγράφει το κείμενο που στέλνεται στο stdout από την εντολή που περιέχει. Το return
δεν δίνει έξοδο στο stdout. Το $?
περιέχει τον κωδικό αποτελέσματος της τελευταίας εντολής.
fun1 (){
return 34
}
fun2 (){
fun1
local res=$?
echo $res
}
Η εντολή return
ορίζει τον κωδικό εξόδου της συνάρτησης, όπως ακριβώς κάνει και η εντολή exit
για ολόκληρο το σενάριο.
Ο κωδικός εξόδου για την τελευταία εντολή είναι πάντα διαθέσιμος στη μεταβλητή $?
.
function fun1(){
return 34
}
function fun2(){
local res=$(fun1)
echo $? # <-- Always echos 0 since the 'local' command passes.
res=$(fun1)
echo $? #<-- Outputs 34
}