bash_loop

=loop It=

__Ορισμός__: loop είναι ένα τμήμα του κώδικα (ένα σύνολο εντολών δηλαδή) το οποίο επαναλαμβάνεται εφόσον ικανοποιούνται συγκεκριμένες συνθήκες.


 * 1. for loop** ---

Το πρώτο από τα 3 είδη loop αφορά μια μεταβλητή η οποία μπορεί να πάρει συγκεκριμένες τιμές από μια λίστα. Εδώ, έχουμε την ανάγκη να επαναλάβουμε μια σειρά από εντολές κάθε φορά που η μεταβλητή μας παίρνει μια τιμή από τη λίστα.

Για παράδειγμα μπορεί να έχουμε μια λίστα με τις ημέρες της εβδομάδος (Δευτέρα, Τρίτη, Τετάρτη, Πέμπτη, Παρασκευή, Σάββατο, Κυριακή). Μπορούμε να χρησιμοποιήσουμε μια μεταβλητή (πχ DayOfWeek) η οποία θα παίρνει με τη σειρά ως τιμή μια ημέρα από τη λίστα. Κάθε φορά που παίρνει καινούργια τιμή η "DayOfWeek" θα εκτελούμε ένα κομμάτι κώδικα το οποίο θα χρησιμοποιεί την τρέχουσα τιμή. Ας το δούμε σε κώδικα:

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

DaysList=(Monday Tuesday Wednsday Thursday Friday Saturday Sunday)

for DayOfWeek in ${DaysList[*]} do echo "Today is $DayOfWeek" if [ $DayOfWeek == ${DaysList[5]} -o $DayOfWeek == ${DaysList[6]} ] then echo ":-)"		echo	fi

done

code

Επίσης κλασσική χρήση της εντολής for έχουμε όταν θέλουμε να χρησιμοποιήσουμε μια μεταβλητή η οποία ξεκινάει με συγκεκριμένη τιμή και αυξάνεται (ή μειώνεται) κατά συγκεκριμένο ποσό μέχρι να φτάσει σε κάποιο όριο. Σε απλό παράδειγμα, μπορεί να έχουμε τη μεταβλητή "a" ή οποία ξεκινάει με την τιμή "1" και αυξάνεται κατά "1" μέχρι να φτάσει στο "10. Για κάθε τιμή που παίρνει η "a" (δηλ. 1,2,3,4,5,6,7,8,9 και 10) εκτελούμε το κομμάτι του κώδικα που θέλουμε:

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

for ((count=$DownLimit; count <= $UpLimit; count++)) do echo $count done echo echo "Congratulations, you made me count from $DownLimit to $UpLimit !!" code


 * 2. while loop** ---

Εδώ εξετάζεται μια συνθήκη και εφόσον είναι αληθής τότε εκτελείται συγκεκριμένο κομμάτι του κώδικα. Μετά η συνθήκη επανεξετάζεται. Είναι κατανοητό ότι κατά την εκτέλεση ενός προγράμματος, αν δεν ικανοποιείται η συνθήκη της "while" τότε το κομμάτι του κώδικα που την αφορά δεν θα εκτελεστεί ποτέ. Επίσης υπάρχει περίπτωση (ΠΡΟΣΟΧΗ) κατά την εκτέλεση του κώδικα που αφορά τo while loop να μην αλλάζουν οι παράμετροι που τελικά θα διαφοροποιήσουν τη συνθήκη, με αποτέλεσμα το loop να εκτελείται συνέχεια !! (μπορεί βέβαια και αυτό να είναι το ζητούμενο ) Ακολουθεί παρόμοιο παράδειγμα με την εντολή if. Χρησιμοποιούμε τη μεταβλητή "count" η οποία παίρνει τιμές από το 1 έως το 10. Κάθε φορά που παίρνει καινούργια τιμή θα τυπώνουμε στην οθόνη ένα μήνυμα. Δηλαδή το μόνο που κάνει το παρακάτω script είναι να τυπώνει 10 φορές το ίδιο μήνυμα:

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

DownLimit=1 UpLimit=10 MyMessage="My name is luckyb :-)"

count=$DownLimit while [ $count -le $UpLimit ] do echo $MyMessage count=$[count+1] done echo echo "Congratulations, you made me say the same think $[$UpLimit-$DownLimit] times" code

Τι θα γινότανε όμως αν δεν υπήρχε η εντολή "count=$[count+1]" (αυξάνει κάθε φορά την τιμή της μεταβλητής count κατά 1, ώστε όταν φτάσει στο "11" να μην ισχύει η συνθήκη της while και να σταματήσει το loop). Βάλτε ένα καγκελάκι (#) μπροστά της (ώστε να την κάνετε σχόλιο) και τρέξτε το script. Παρατηρούμε ότι το loop θα τρέχει για πάντα αν δεν το σταματήσουμε.

Υπενθυμίζουμε ότι μπορούμε οποιαδήποτε στιγμή να διακόψουμε την εκτέλεση ενός script πατώντας το συνδυασμό πλήκτρων "ctrl+c"


 * 3. until loop** ---

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

Γράψτε το κατωτέρω script αρχείο και τρέξτε το:

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

clear

UserIn="1"

until [ $UserIn == "2" ] do echo "- Main Menu -" echo "1. Back to main menu" echo "2. Quit" echo "Please select from one of the above options and press enter:" read UserIn echo clear echo "You selected : $UserIn" case $UserIn in	1)		echo "Going back to main menu ..."		;;	2) echo "...exiting until loop" ;;	*)		echo "Please use only option "1" or option "2""		echo				;;	esac	echo done

echo echo "This script come to an end !!" echo code

__Εξήγηση:__ Το συγκεκριμένο script μας εμφανίζει ένα μενού επιλογών και μας ζητάει να πληκτρολογήσουμε τον αριθμό μιας επιλογής και να πατήσουμε το πλήκτρο "enter". Αν επιλέξουμε "1" τότε θα ξαναεμφανιστεί το μενού. Το "2" σημαίνει "έξοδος" από το script. αν επιλέξουμε οτιδήποτε άλλο, τότε μας βγάζει ένα μήνυμα λάθους και ξαναεμφανίζει το μενού για να επιλέξουμε.

Το script εκτελεί μια σειρά εντολών σε loop μέχρι η μεταβλητή "UserIn" να πάρει την τιμή 2. Ας ρίξουμε μια ματιά στις εντολές:

1. Καθάρισμα οθόνης 2. Αρχικοποίηση της μετβλητής "UserIn" (με την τιμή "1") η οποία αργότερα θα πάρει ως τιμή κάποια εισαγωγή από τον χρήστη. 3. Αρχή loop: Εξέταση της συνθήκης αν η τιμή της "UserIn" είναι ίση με "2" με την εντολή until.Αν ΔΕΝ είναι αληθής τότε πήγαινε στο βήμα 5, διαφορετικάς πήγαινε στο βήμα 11 4. Εμφάνιση στην οθόνη του μενού με τις επιλογές 1 και 2. 5. Με την εντολή "read UserIn", το script περιμένει μέχρι ο χρήστης να πληκτρολογήσει κάτι και να πατήσει το πλήκτρο "enter". Το αποτέλεσμα της εισαγωγής αποθηκεύεται στη μεταβλητή "UserIn". 6. Με την case εξετάζεται το τι έγραψε ο χρήστης. 7. Αν ήταν "1" τότε εμφανίζει το μήνυμα "Going back to main menu". 8. Αν ήταν "2" τότε εμφανίζει το μήνυμα "...exiting script". 9. Αν ήταν οτιδήποτε άλλο τότε εμφανίζει το μήνυμα "Please use only option "1" or option "2" " 10. Το loop ξαναγυρνάει στην αρχή του (βήμα 3). 11. Τέλος loop (done) 12. Τέλος script


 * break και continue** ---

Η εντολή "break" χρησιμοποιείται για έξοδο από το τρέχον loop. Συνήθως χρησιμοποιείται όταν δεν γνωρίζουμε από την αρχή πόσες φορές θα χρειαστεί να εκτελεστεί το loop (πχ επειδή εξαρτάται από εισαγωγή στοιχείων από τον χρήστη)

Δίνεται παράδειγμα με while loop:

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

while true do echo "- Main Menu -" echo "1. Back to main menu" echo "2. Quit" echo "Please select from one of the above options and press enter:" read UserIn clear echo "You selected : $UserIn" echo

case $UserIn in	1)		echo "Going back to main menu ..."		;;	2) echo "...exiting while loop" break ;;	*)		echo "Please use only option "1" or option "2""				;;	esac done

echo echo "I just hit a break command and got out of this infinite loop !!" echo code

Η ουσία αυτού του script είναι ίδια ακριβώς με το παράδειγμα του loop "until" μόνο που χρησιμοποιούμε while. Εδώ ξεκινάει το while loop με την συνθήκη "true" η οποία ισχύει πάντα. Δηλαδή το loop θα επαναλαμβάνεται επ' άπειρο. Όμοια γίνεται εισαγωγή στοιχείων από τον χρήστη, αποθηκεύονται στη μεταβλητή "UserIn" και εξετάζεται η τιμή της με την "case". Η διαφορά εδώ είναι ότι αν η UserIn έχει την τιμή "2" τότε θα εκτελεστεί και η εντολή "break" η οποία μας βγάζει άνευ όρων από το loop (το οποίο θα έτρεχε για πάντα).

Με την εντολή "continue" έχουμε τη δυνατότητα να παραλείψουμε όλες τις εναπομείνασες εντολές ενός loop και να ξαναγυρίσουμε στην αρχή του (loop). Στον παρακάτω "εικονικό" κώδικα:

code format="text" Αρχή loop Εντολή1 Εντολή2

continue

Εντολή3 Εντολή4 Τέλος loop Εκτελούνται κατά σειρά : 1. Εντολή1 2. Εντολή2 3. Continue (πήγαινε στην "Αρχή loop") 4. Εντολή1 5. Εντολή2 ... code


 * select - Φτιάχνοντας εύκολα μενού** ---

Η δημιουργία μενού στο bash μπορεί να γίνει πολύ πιο εύκολη από τα παραδείγματα που μόλις είδαμε με την εντολή "select"

Η σύνταξη της είναι παρόμοια με την αντίστοιχη της "for":

code format="text" select WORD [in LIST]; do commands done code

Ακολουθεί και ένα απλό παράδειγμα δημιουργίας μενού :

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

options[0]="1. I'm having a good day" options[1]="2. I'm having a bad day"

clear

echo "-- Menu --"

select UserIn in "${options[@]}"; do echo echo "You selected : $UserIn"

case $UserIn in	${options[0]})		echo ":-)" ;;	${options[1]})		echo ":-(" ;;	*)		echo "Ma kala, den vlepeis oti exeis na epilekseis to "1" i to "2"?? Giati grafeis oti na'nai ??"				;;	esac	break	echo done code

Παρατηρούμε ότι οι επιλογές του μενού ορίζονται ξεχωριστά ως μέλη του array "options". Με την εντολή

code format="text" select UserIn in "${options[@]}"; code το script εμφανίζει τις επιλογές του μενού και περιμένει για την εισαγωγή κειμένου από τον χρήστη την οποία αποθηκεύει στη μεταβλητή "UserIn". Κατόπιν, ανάλογα με την τιμή της UserIn μας βγάζει και διαφορετικό μήνυμα (case). Αν δεν υπήρχε η εντολή "break" όλος ο κώδικας που περικλείεται από την "select" θα εκτελούνταν επ' άπειρο.

-- Πίνακας περιεχομένων Προηγούμενο (Συνθήκες) Επόμενο (Συναρτήσεις)