Συναρτήσεις (functions)


(ή Ρουτίνες )


Οι συναρτήσεις είναι ένας τρόπος να ομαδοποιήσουμε ένα σύνολο εντολών χρησιμοποιώντας κάποιο όνομα. Έτσι μπορούμε να εκτελέσουμε όλες τις εντολές της ομάδας καλώντας απλά το όνομα της συνάρτησης.

Μπορείτε να το φανταστείτε σαν ένα "μαύρο κουτί" που κάνει μια συγκεκριμένη διεργασία.
Δεν είναι πολύ χρήσιμο όταν χρειάζεται να εκτελέσουμε αυτή τη διεργασία πολλές φορές ;;
Επίσης η δομή του προγράμματός μας θα γίνει πολύ πιο κατανοητή.

Το όνομα μιας συνάρτησης πρέπει να είναι μοναδικό στο script αρχείο και οι εντολές που περικλείονται εκτελούνται σαν κανονικές εντολές.
Τέλος, ο ορισμός μιας συνάρτησης πρέπει πάντα να προηγείται από την κλήση της.

Σύνταξη:

function FUNCTION_NAME
{
    COMMANDS
}
ή
Κώδικας: Select All | Copy To Clipboard
FUNCTION_NAME ()
{
    COMMANDS
}
 
Δηλαδή στον κατωτέρω εικονικό κώδικα:
Κώδικας: Select All | Copy To Clipboard
#! /bin/bash
 
# Function doThings -----------------
doThings()
{
    command1
    command2
}
 
# Main script code ------------------
 
command3
command4
doThings
command5
Θα εκτελεστούν κατά σειρά οι εντολές:
1. command3
2. command4
3. command1
4. command2
5. command5

Ας δούμε ένα απλό παράδειγμα:

#! /bin/bash
 
# Definition of function func -------------------
func()
{
    echo "You just called the func function"
    echo "Press enter to go back to main script"
    echo
    read
}
 
# Main script code ------------------------------
echo "The main script code is executed"
echo "Please wait 3 seconds..."
echo
sleep 3
func
echo "You are back in main now "
echo "Congratulation, you just made your first successful function call !!"
echo "...exiting"
sleep 1

Παρατηρούμε ότι το script μας ειδοποιεί αρχικά ότι βρισκόμαστε στο κυρίως μέρος.
Υπάρχει μια αναμονή 3 δευτερολέπτων (sleep 3) και μετά καλείται η συνάρτηση "func".
Κατά την εκτέλεση της ομάδας εντολών της "func" προειδοποιούμαστε ότι πρέπει να πατήσουμε το πλήκτρο "enter" για να συνεχίσουμε.
Αφού το κάνουμε μεταφερόμαστε πάλι στον κυρίως κώδικα (στο σημείο που είχαμε σταματήσει) και εκτελούνται οι εναπoμείνασες εντολές.


exit - return & exit status ή return status

Στο σημείο αυτό θα κάνουμε μια (μικρή) παρένθεση για να μιλήσουμε για τις εντολές exit, return και το exit status (ή αλλιώς return status)

Η εντολή "exit" χρησιμοποιείται για να τερματίσει ένα script. Επίσης μπορεί να επιστρέψει μια τιμή γνωστή ως "exit status".
Όμοια όταν έχουμε να κάνουμε με συνάρτηση η αντίστοιχη εντολή είναι "return".


Κάθε φορά που εκτελείται μια οποιαδήποτε εντολή επιστρέφεται κι ένα "exit status" (ή "return status"). Αν η εκτέλεση της εντολής ήταν επιτυχής τότε το exit status θα είναι μηδέν (0). Σε διαφορετική περίπτωση, το exit status θα πάρει μια τιμή, η οποία μπορεί και να μεταφραστεί ως κωδικός λάθους.

Οποιαδήποτε συνάρτηση μέσα σ' ένα script και το script το ίδιο επιστρέφουν το δικό τους "exit status".

Όταν τώρα τερματίσουμε ένα script με την εντολή "exit $?" ή σκέτο "exit", τότε το "exit status" που επιστρέφεται είναι αυτό που επέστρεψε η εκτέλεση της τελευταίας εντολής (Οι χαρακτήρες $? διαβάζουν το exit status της τελευταίας εντολής).
Μπορούμε βέβαια να ορίσουμε δικό μας exit status (γιατί έτσι μας αρέσει ή μας βοηθάει) δίνοντας "exit Χ", με 0 < Χ <255.
Τα ίδια μπορούν να γίνουν σε μια συνάρτηση με την εντολή return.


Δείτε το ακόλουθο παράδειγμα:

#! /bin/bash
 
func()
{
    echo "You just called the func function"
    return 100
    echo "This command will never be executed because command return terminates the function too early !!"
}
 
clear
 
echo "luckyb"
echo "The exit status of the last command is: " $?
echo "--------------------------------------------"
echo
sleep 3
 
mplamplaCOMMAND
echo "The exit status of the last command is: " $?
echo "--------------------------------------------"
echo
sleep 3
 
echo "Calling the func function..."
echo
func
echo "The return status of func is: " $?
echo "--------------------------------------------"
echo
sleep 3
 
echo "Now the script will be forced to exit with an exit status of 200"
echo "(To verify this type 'echo \$?' now)"
echo "...exiting"
echo
sleep 3
 
exit 200
 
echo "This command will never be executed"

Αρχικά εκτελείται μια εντολή (echo "luckyb") κανονικά και μας επιστρέφει exit status 0.
Μετά εκτελείται μια εντολή η οποία δεν αναγνωρίζεται (mplamplaCOMMAND) και μας επιστρέφει μη μηδενικό exit status.
Έπειτα καλούμε τη συνάρτηση "func" η οποία τερματίζεται βίαια με την εντολή "return" κι επιστρέφει return status 100.
Τέλος αναγκάζουμε το script να τερματιστεί με exit status 200.
Για να το επιβεβαιώσουμε αρκεί να δώσουμε την εντολή "echo $?".
Η τελευταία εντολή δεν θα εκτελεστεί ποτέ γιατί αναγκάσαμε το script να τερματιστεί πριν απ' αυτή.


Παράμετροι

Οι συναρτήσεις όμως, δεν είναι πάντα "παθητικές". Δηλαδή η χρήση τους δεν περιορίζεται μόνο στην εκτέλεση μερικών εντολών.

Είναι δυνατό να τους περάσουμε παραμέτρους, να επεξεργαστούν αυτές τις παραμέτρους και να επιστρέψουν ένα (ή περισσότερα) αποτέλεσμα.

Δηλαδή αντί στην κλήση τους να δώσουμε ένα ξερό πχ func, να δώσουμε "func 4".
Έτσι η συνάρτηση "func" θα πάρει τον αριθμό "4" (ή ότι άλλο δώσουμε), θα κάνει ότι θέλει μ'αυτόν και πιθανόν να μας επιστρέψει κάποιο αποτέλεσμα.

Ακολουθεί παράδειγμα στο οποίο υπολογίζεται το τετράγωνο κάποιου αριθμού:

#! /bin/bash
 
# Definition of function square -------------------
square()
{
returnSquare=$[$1 * $1]
}
 
# Main script code ------------------------------
echo "This script calculates the square of a given number"
echo "Please type a number :"
read num
square num
echo
echo "The square of $num is: $returnSquare"

Εξήγηση :
Αρχικά το script παίρνει έναν αριθμό τον οποίο πληκτρολογεί ο χρήστης και τον αποθηκεύει στη μεταβλητή "num"
Μετά καλείται η συνάρτηση "square" με παράμετρο την τιμή της μεταβλητής "num".
Εδώ χρησιμοποιούμε μόνο μια παράμετρο η οποία έχει τη θέση "1"
Θα μπορούσαμε να χρησιμοποιήσουμε παραπάνω παραμέτρους με αντίστοιχες θέσεις 2, 3, ...κλπ
Μέσα στη συνάρτηση αναφερόμαστε στις τιμές των παραμέτρων με τους συμβολισμούς "$1", "$2", "$3", ...κλπ.
Η συνάρτηση "square" λοιπόν, δημιουργεί την μεταβλητή returnSquare η οποία παίρνει σαν τιμή το αποτέλεσμα της πράξης $1*$1, δηλαδή [την πρώτη παράμετρο επί την πρώτη παράμετρο.
Τέλος η τιμή της returnSquare τυπώνεται στην οθόνη.


local ή global μεταβλητές ;;
Μέχρι τώρα, οι μεταβλητές που χρησιμοποιούσαμε είναι "ορατές" σε όλο το κομμάτι του κώδικα ενός script.
πχ στο τελευταίο παράδειγμα η μεταβλητή "returnSquare" παίρνει τιμή μέσα στη συνάρτηση "square" και αυτή η τιμή τυπώνεται άνετα στην οθόνη με εντολή που βρίσκεται στο κυρίως πρόγραμμα.

Αυτές οι μεταβλητές ονομάζονται global.

Υπάρχει περίπτωση όμως να θέλουμε μια μεταβλητή να είναι "ορατή" μόνο σε συγκεκριμένο κομμάτι του κώδικά μας (για παράδειγμα μόνο μέσα σε μια συνάρτηση).Αυτός ο τύπος μεταβλητών ονομάζεται local.

Οι local μεταβλητές ορίζονται ως εξής:

local VARIABLE

Πάλι στο τελευταίο παράδειγμα, αν αλλάξουμε την εντολή "returnSquare=$[$1 * $1]" με αυτή: "local returnSquare=$[$1 * $1]", τότε θα μπορούμε να δούμε την τιμή της μόνο μέσα στη συνάρτηση "square" κι όχι από οποιοδήποτε σημείο του προγράμματος:

#! /bin/bash
 
# Definition of function square -------------------
square()
{
local returnSquare=$[$1 * $1]
echo
echo "You are in function square now..."
echo "The square of $num is: $returnSquare"
}
 
# Main script code ------------------------------
echo "This script calculates the square of a given number"
echo "Please type a number :"
read num
square num
echo
echo "You are in main now"
echo "The square of $num is: $returnSquare"





Πίνακας περιεχομένων
Προηγούμενο (loop It)
Επόμενο (Από τη θεωρία στην πράξη)