loop It


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

1. for loop -------------------------------------------------------------------------------

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

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


#! /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
 

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


#! /bin/bash
DownLimit=1
UpLimit=10
 
for ((count=$DownLimit; count <= $UpLimit; count++))
do
    echo $count
done
echo
echo "Congratulations, you made me count from $DownLimit to $UpLimit !!"



2. while loop -------------------------------------------------------------------------------

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


#! /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"


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

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


3. until loop -------------------------------------------------------------------------------

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

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


#! /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

Εξήγηση:
Το συγκεκριμένο 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:

#! /bin/bash
clear
 
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

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


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


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



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

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

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


select WORD [in LIST];
do
    commands
done


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

#! /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

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

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




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