bash_functions

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


 * (ή Ρουτίνες )**

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

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

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

__Σύνταξη:__

code format="text" function FUNCTION_NAME {	COMMANDS } ή Κώδικας: Select All | Copy To Clipboard FUNCTION_NAME {	COMMANDS }

Δηλαδή στον κατωτέρω εικονικό κώδικα: Κώδικας: Select All | Copy To Clipboard
 * 1) ! /bin/bash

doThings {	command1 command2 }
 * 1) Function doThings -


 * 1) Main script code --

command3 command4 doThings command5 code Θα εκτελεστούν κατά σειρά οι εντολές: 1. command3 2. command4 3. command1 4. command2 5. command5

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

code format="text"
 * 1) ! /bin/bash

func {	echo "You just called the func function" echo "Press enter to go back to main script" echo read }
 * 1) Definition of function func ---

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 code
 * 1) Main script code --

Παρατηρούμε ότι το 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.

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

code format="text"
 * 1) ! /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" code

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


 * Παράμετροι**

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

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

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

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

code format="text"
 * 1) ! /bin/bash

square { returnSquare=$[$1 * $1] }
 * 1) Definition of function square ---

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" code
 * 1) Main script code --

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

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

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

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

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

code format="text" local VARIABLE code

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

code format="text"
 * 1) ! /bin/bash

square { local returnSquare=$[$1 * $1] echo echo "You are in function square now..." echo "The square of $num is: $returnSquare" }
 * 1) Definition of function square ---

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" code
 * 1) Main script code --

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