Τιμή επιστροφής σε μια συνάρτηση Bash

Εργάζομαι με ένα σενάριο 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. Η προεπιλεγμένη τιμή επιστροφής είναι η τιμή εξόδου της τελευταίας εντολής που εκτελέστηκε εντός της συνάρτησης.

Σχόλια (12)

$(...) καταγράφει το κείμενο που στέλνεται στο stdout από την εντολή που περιέχει. Το return δεν δίνει έξοδο στο stdout. Το $? περιέχει τον κωδικό αποτελέσματος της τελευταίας εντολής.

fun1 (){
  return 34
}

fun2 (){
  fun1
  local res=$?
  echo $res
}
Σχόλια (2)

Η εντολή return ορίζει τον κωδικό εξόδου της συνάρτησης, όπως ακριβώς κάνει και η εντολή exit για ολόκληρο το σενάριο.

Ο κωδικός εξόδου για την τελευταία εντολή είναι πάντα διαθέσιμος στη μεταβλητή $?.


function fun1(){
  return 34
}

function fun2(){
  local res=$(fun1)
  echo $? # 
Σχόλια (0)