bash_conditions

=Συνθήκες (Conditions)= ή (πιο φιλοσοφικά):


 * Τι είναι αλήθεια και πώς να δράσουμε όταν τη βρούμε !!**

Μέχρι τώρα είδαμε πώς σ' ένα bash script εκτελούνται όλες οι εντολές που περιέχονται σ' αυτό. Τι γίνεται όμως όταν θέλουμε να "διαφοροποιήσουμε τον ρου του προγράμματός μας" ;

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

Αρχίζω και γίνομαι αόριστος ;

Ας αναζητήσουμε μαζί την αλήθεια


 * if**

Όπως είδαμε στην εισαγωγή (μη μου πείτε ότι ΑΚΟΜΑ ΔΕΝ ΤΗ ΔΙΑΒΑΣΑΤΕ !!) κάθε γραμμή ενός script είναι και μια εντολή. Αυτές διαβάζονται και εκτελούνται μία μία.

Με την εντολή if ( Αν, στα Ελληνικά ) έχουμε τη δυνατότητα να ελέγξουμε εάν μια συνθήκη είναι αληθής ή ψευδής (για παράδειγμα: "Είναι δυο μεταβλητές ίσες" ή "Υπάρχει το τάδε αρχείο") και μόνο τότε να εκτελεστούν συγκεκριμένες εντολές.

Η σύνταξη της εντολής "if" ακολουθεί το παρακάτω πρότυπο:

code if [Condition is TRUE] then command1 command2 . . . else command3 command4 ... fi code

Το οποίο σημαίνει: "Αν η συνθήκη Condition είναι αληθής, τότε εκτέλεσε τις εντολές command1 και command2 και ... (όσες εντολές θέλουμε). Αλλιώς (αν η συνθήκη δεν είναι αληθής) τότε εκτέλεσε τις εντολές command3 και command4 και ... (όσες εντολές θέλουμε).

Σημείωση: Το else μαζί με τις command3,4... δεν είναι υποχρεωτικό.

...κι ένα απλό παράδειγμα (οποιαδήποτε ομοιότητα με ονόματα ποδοσφαιρικών ομάδων του Ελληνικού πρωταθλήματος είναι τυχαία :-p):

code
 * 1) ! /bin/bash

OlympiakosScore=5 PaoScore=1

if [ $OlympiakosScore -gt $PaoScore ] then echo "Olympiakara OLE !!" else echo "Apogoiteysi :-(" fi code

Αλλάζοντας τις τιμές των μεταβλητών OlympiakosScore και PaoScore (πειραματιστείτε κατά βούληση) εμφανίζεται στην οθόνη διαφορετικό μήνυμα.

Πριν αρχίσετε τις διαμαρτυρίες ακολουθεί μια πιο δίκαιη (και πιο πολύπλοκη έκδοση):

code
 * 1) ! /bin/bash

OlympiakosScore=5 PaoScore=1

if [ $OlympiakosScore -gt $PaoScore ] then echo "Olympiakara OLE !!" elif [ $OlympiakosScore -lt $PaoScore ] then echo "Panathinaikara OLE !!" else echo "Den ksanavlepo agona Olympiakos - Panathinaikos" fi code

Εδώ χρησιμοποιήσαμε ακόμα μια συνθήκη μέσα στο σύμπλεγμα if-fi με το συνδυασμό εντολή elif-then.

Ας γενικεύσουμε λοιπόν τη σύνταξη της if:

code if [ condition1 is TRUE ] then command1 command2 . . . elif [ condition2 is TRUE ] then command3 command4 . . . elif. . . . . . else command5 command6 ... fi code

__Περισσότερα για τις παραμέτρους__

Θα κατηγοριοποιήσουμε τις παραμέτρους που μπορούμε να χρησιμοποιήσουμε σε μια συνθήκη ανάλογα με το τι είδους τιμή μεταβλητής διαπραγματευόμαστε:
 * 1.** Όνομα αρχείου

[ −b FILE ] Αληθές αν το αρχείο FILE υπάρχει και είναι block αρχείο [ −d FILE ] Αληθές αν το αρχείο FILE υπάρχει και είναι υποκατάλογος (directory). [ −e FILE ] Αληθές αν το αρχείο FILE υπάρχει. [ −f FILE ] Αληθές αν το αρχείο FILE υπάρχει και είναι απλό αρχείο [ −h FILE ] Αληθές αν το αρχείο FILE υπάρχει και είναι a symbolic link. [ −r FILE ] Αληθές αν το αρχείο FILE υπάρχει και είναι αναγνώσιμο (readable) [ −s FILE ] Αληθές αν το αρχείο FILE υπάρχει και έχει μέγεθος μεγαλύτερο από μηδέν [ −w FILE ] Αληθές αν το αρχείο FILE υπάρχει και είναι εγγράψιμο (writable) [ −x FILE ] Αληθές αν το αρχείο FILE υπάρχει και είναι εκτελέσιμο (executable) [ −O FILE ] Αληθές αν το αρχείο FILE υπάρχει και ο κάτοχος του είναι ο τρέχων χρήστης [ −G FILE ] Αληθές αν το αρχείο FILE υπάρχει και ο κάτοχος του είναι διαφορετικός από τον τρέχων χρήστη [ −N FILE ] Αληθές αν το αρχείο FILE υπάρχει και έχει τροποποιηθεί από την τελευταία του ανάγνωση [ −S FILE ] Αληθές αν το αρχείο FILE υπάρχει και είναι socket. [ FILE1 −nt FILE2 ] Αληθές αν το αρχείο FILE1 τροποποιήθηκε πιο προσφατα από το FILE2 ή αν το FILE1 υπάρχει ενώ το FILE2 όχι [ FILE1 −ot FILE2 ] Αληθές αν το αρχείο FILE2 τροποποιήθηκε πιο προσφατα από το FILE1 ή αν το FILE2 υπάρχει ενώ το FILE1 όχι


 * 2.** String (αλφαριθμητικοί χαρακτήρες)

[ −z STRING ] Αληθές αν το μήκος του STRING είναι μηδέν [ −n STRING ] ή [ STRING ] Αληθές αν το μήκος του STRING δεν είναι μηδέν. (Το μήκος ενός string είναι το πλήθος των χαρακτήρων που περιέχει)

[ STRING1 == STRING2 ] Αληθές αν το STRING1 είναι ίδιο με το STRING2 [ STRING1 != STRING2 ] Αληθές αν το STRING1 είναι διαφορετικό από το STRING2 [ STRING1 < STRING2 ] Αληθές αν το STRING1 είναι πρώτο κατ' αλφαβητική σειρά από το STRING2 [ STRING1 > STRING2 ] Αληθές αν το STRING1 είναι δεύτερο κατ' αλφαβητική σειρά από το STRING2


 * 3.** Ακέραιος αριθμός

[ NUM1 -eq NUM2 ] Αληθές αν το NUM1 είναι ίσο με το NUM2 [ NUM1 -ne NUM2 ] Αληθές αν το NUM1 είναι διαφορετικό από το NUM2 [ NUM1 -lt NUM2 ] Αληθές αν το NUM1 είναι μικρότερο από το NUM2 [ NUM1 -le NUM2 ] Αληθές αν το NUM1 είναι μικρότερο ή ίσο με το NUM2 [ NUM1 -gt NUM2 ] Αληθές αν το NUM1 είναι μεγαλύτερο από το NUM2 [ NUM1 -ge NUM2 ] Αληθές αν το NUM1 είναι μεγαλύτερο ή ίσο από το NUM2

(έτσι, για να σας μπλέξω κι άλλο )
 * 4.** Ολόκληρες εκφράσεις συνθηκών

[ ! EXPR ] Αληθές αν η συνθήκη EXPR είναι ψευδής [ EXPR1 −a EXPR2 ] Αληθές αν και οι δυο συνθήκες EXPR1 και EXPR2 είναι αληθείς [ EXPR1 −o EXPR2 ] Αληθές αν μια από τις δυο συνθήκες EXPR1 ή EXPR2 είναι αληθής


 * case**

Οι εκφράσεις συνθηκών με την εντολή if/elif διευκολύνουν πολλές φορές. Όταν όμως θέλουμε να διαπραγματευτούμε πολλές συνθήκες που αφορούν μια μεταβλητή και απαιτείται η πολλαπλή χρήση της elif, τότε είναι προτιμότερο να χρησιμοποιήσουμε την εντολή case η οποία συντάσσεται ως εξής:

code case Έκφραση [Περίπτωση 1])   Εντολή1    Εντολή2    ... [Περίπτωση 2]) Εντολή3 Εντολή4 ... [Περίπτωση 3])   Εντολή5    Εντολή6    ... . . . esac

code

Φυσικά μπορούμε να χρησιμοποιήσουμε όσες περιπτώσεις και όσες εντολές θέλουμε για κάθε περίπτωση.

παράδειγμα Δηλώνουμε ένα array (Periodos) με 3 μέλη, το κάθε ένα από τα οποία περιέχει τις λέξεις "Πρωί", "Απόγευμα", "Βράδυ". Δηλώνουμε μια μεταβλητή (Tora) και της δίνουμε μια από τις 3 τιμές του array Periodos. Αποδεκτοί αριθμοί μέσα στις αγγύλες του array για τη σωστή αρχικοποίηση της μεταβλητής Tora είναι οι 0, 1, 2. Δηλαδή η μεταβλητή Tora θα πάρει μια από τις 3 τιμές (Πρωι, Απόγευμα, Βράδυ)

Θέλουμε, ανάλογα με την περίοδο της ημέρας που δηλώνουμε να γράφεται στην οθόνη και το ανάλογο μήνυμα το οποίο αποθηκεύουμε ως τιμή στην μεταβλητή "MyMessage". Επίσης, αν κάνουμε λάθος και βάλουμε λάθος αριθμό στις αγκύλες του array Periodos, θέλουμε να ειδοποιούμαστε. Τέλος, αν τα έχουμε κάνει όλα σωστά θέλουμε να γράφεται στην οθόνη και η τρέχουσα περίοδος του 24ώρου:

code
 * 1) ! /bin/bash

Periodos=(Proi Apogeuma Vrady) Tora=${Periodos[0]}

case $Tora in Proi)   MyMessage="Kalimera !!" Apogeuma) MyMessage="Kalispera !!" Vrady)   MyMessage="Kalinyxta !!"    MyMessage="apodektoi arithmoi gia to array Periodos einai oi: 0,1,2" esac if [ $Tora ] then    echo "Tora einai $Tora" fi echo $MyMessag code

Παρατηρήστε ότι στην τελευταία έκφραση της case έχουμε βάλει τον χαρακτήρα *. Έτσι αυτό το τμήμα του κώδικα θα εκτελεστεί σε όλες τις άλλες περιπτώσεις εκτός τις προαναφερθείσες (Proi, Apogeuma, Vrady)

Πίνακας περιεχομένων Προηγούμενο (Μεταβλητές, ειδικοί χαρακτήρες ...κι άλλα περίεργα) Επόμενο (loop It)