Συνθήκες (Conditions)

ή (πιο φιλοσοφικά):

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

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

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

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

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


if ------------------------------------------------------------------------------------

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

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

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

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

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

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

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


#! /bin/bash
 
OlympiakosScore=5
PaoScore=1
 
if [ $OlympiakosScore -gt $PaoScore ]
then
    echo "Olympiakara OLE !!"
else
    echo "Apogoiteysi :-("
fi

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

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


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

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

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

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


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

Θα κατηγοριοποιήσουμε τις παραμέτρους που μπορούμε να χρησιμοποιήσουμε σε μια συνθήκη ανάλογα με το τι είδους τιμή μεταβλητής διαπραγματευόμαστε:
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 η οποία συντάσσεται ως εξής:

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

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

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

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

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

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




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