Σε αυτό το μάθημα, θα δούμε πώς μπορούμε να χρησιμοποιήσουμε τις δηλώσεις If-Then-Else σε σενάρια περιβάλλοντος Bash που γράφουμε. Οι δηλώσεις If-then-Else είναι ένα χρήσιμο εργαλείο για την παροχή ενός τρόπου καθορισμού της πορείας δράσης ενός σεναρίου όταν πληρούνται ορισμένες προϋποθέσεις. Ας δούμε ποια είναι η σύνταξη για τις δηλώσεις If-then-Else:
ανΜΕΡΙΚΕΣ ΕΝΤΟΛΕΣ?τότεΤΟΤΕ-ΕΝΤΟΛΕΣ?
αλλούΑΛΛΕΣ-ΕΝΤΟΛΕΣ?
είναι
Στην παραπάνω εντολή που εμφανίζεται, εάν διαπιστωθεί ότι ορισμένες εντολές είναι αληθινές ή η κατάσταση επιστροφής του 0, τότε θα εκτελεστούν οι ΤΕΧΝΕΣ ΕΝΤΟΛΕΣ. Εάν αυτό δεν συμβαίνει, εκτελούνται οι ΑΛΛΕΣ-ΕΝΤΟΛΕΣ. Σε ΜΕΡΙΚΕΣ ΕΝΤΟΛΕΣ, κάνουμε συνήθως σύγκριση συμβολοσειράς ή σύγκριση τιμών με τη μορφή ακεραίων. Μπορούμε επίσης να κάνουμε πολλές λειτουργίες που περιλαμβάνουν αρχεία. Ας δούμε μερικά παραδείγματα πρωτογενών εντολών που χρησιμοποιούνται κυρίως όταν εργάζεστε με συνθήκες που βασίζονται σε αρχεία:
Πρωταρχικός | Εννοια |
---|---|
[ -προς το ] | Επιστρέφει true όταν υπάρχει FILE. |
[-σι] | Εμφανίζεται true όταν υπάρχει FILE και είναι αποκλειστικό αρχείο αποκλεισμού. |
[-ντο] | Επιστρέφει true όταν υπάρχει FILE & είναι ένα ειδικό αρχείο χαρακτήρων. |
[-δ] | Επιστρέφει true όταν υπάρχει FILE & είναι κατάλογος. |
[ -Και ] | Επιστρέφει true όταν υπάρχει FILE. |
[-f] | Επιστρέφει true όταν υπάρχει FILE & είναι κανονικό αρχείο. |
[-g] | Επιστρέφει true όταν υπάρχει FILE και έχει οριστεί το bit SGID. |
[-η] | Εμφανίζεται true όταν υπάρχει FILE & είναι ένας συμβολικός σύνδεσμος. |
[-κ] | Επιστρέφει true όταν υπάρχει FILE και έχει ρυθμιστεί το κολλώδες bit του. |
[ -Π ] | Επιστρέφει true όταν υπάρχει FILE & είναι ένας σωλήνας με όνομα (FIFO). |
[-r] | Επιστρέφει true όταν υπάρχει FILE & είναι αναγνώσιμο. |
[-σ] | Επιστρέφει true όταν υπάρχει FILE και έχει μέγεθος μεγαλύτερο από μηδέν. |
[-t] | Εμφανίζεται true όταν ο περιγραφέας αρχείων FD είναι ανοιχτός και αναφέρεται σε τερματικό. |
[-u] | Εμφανίζεται true όταν υπάρχει FILE και έχει οριστεί το bit SUID (set user ID). |
[ -σε ] | Επιστρέφει true όταν υπάρχει FILE & είναι εγγράψιμο. |
[-Χ] | Επιστρέφει true όταν υπάρχει FILE & είναι εκτελέσιμο. |
[-Ο] | Επιστρέφει true όταν υπάρχει FILE και ανήκει στο πραγματικό αναγνωριστικό χρήστη. |
[-G] | Επιστρέφει true όταν υπάρχει FILE και ανήκει στο πραγματικό αναγνωριστικό ομάδας. |
[ -Ο ] | Εμφανίζεται true όταν υπάρχει FILE & είναι ένας συμβολικός σύνδεσμος. |
[-N] | Εμφανίζεται true όταν υπάρχει FILE & έχει τροποποιηθεί από την τελευταία ανάγνωσή του. |
[-S] | Επιστρέφει true όταν υπάρχει FILE & είναι μια πρίζα. |
Οι THEN-COMMANDS και οι ELSE-COMMANDS μπορούν να είναι οποιεσδήποτε έγκυρες λειτουργίες UNIX ή οποιοδήποτε εκτελέσιμο πρόγραμμα. Σημειώστε ότι το τότε και είναι οι εντολές χωρίζονται με ημι-άνω τελεία καθώς θεωρούνται ότι είναι εντελώς ξεχωριστά στοιχεία ενός σεναρίου.
Αν-Τότε-Άλλο Απλό Παράδειγμα
Ας ξεκινήσουμε το μάθημά μας με ένα πολύ απλό παράδειγμα με δηλώσεις If-then-Else.
Εδώ είναι ένα δείγμα προγράμματος:
Εδώ είναι η έξοδος που βλέπουμε κατά την εκτέλεση του σεναρίου μας:
$. ifelse1.shΟι τιμές είναι ίδιες!
$
Χρησιμοποιώντας ορίσματα γραμμής εντολών
Μπορούμε επίσης να χρησιμοποιήσουμε ορίσματα γραμμής εντολών στα σενάρια μας και να χρησιμοποιήσουμε τον αριθμό των ορισμάτων και τις ίδιες τις τιμές ως προϋπόθεση στη δήλωση IF που ορίζουμε. Αρχικά ορίζουμε ένα αρχείο κειμένου με το ακόλουθο περιεχόμενο:
Το όνομά μου είναι LinuxHint. Λατρεύω τους διακομιστές, ειδικά τους Ubuntu. Έτσι είναι
τερματισμός!
Τώρα, μπορούμε να γράψουμε ένα σενάριο το οποίο βρίσκει αν μια λέξη εμφανίζεται σε ένα αρχείο κειμένου ή όχι. Ας ορίσουμε το σενάριο τώρα:
πέταξε έξω 'Εύρεση 1 $ σε 2 $'λαβή $ 1 $ 2
αν [ $? -γεννημένος 0 ]
τότε
πέταξε έξω 'Δεν βρέθηκε $ 1 στο αρχείο $ 2.'
αλλού
πέταξε έξω 'Βρέθηκε $ 1 στο αρχείο $ 2.'
είναι
πέταξε έξω 'Το σενάριο ολοκληρώθηκε.'
Αυτό το σενάριο είναι πολύ δυναμικό. Θεωρεί τη λέξη για εύρεση και το αρχείο για αναζήτηση από την ίδια τη γραμμή εντολών. Τώρα, είμαστε έτοιμοι να εκτελέσουμε το σενάριό μας:
Το ifelse2.sh love hello.txtΘα δούμε μια έξοδο όπως:
Εύρεση αγάπηςσεhello.txtη αγάπη βρέθηκεσε αρχείοhello.txt.
Το σενάριο ολοκληρώθηκε.
Έλεγχος αριθμού ορισμάτων γραμμής εντολών
Μέσα σε μια δήλωση IF, μπορούμε ακόμη να ελέγξουμε πόσα ορίσματα της γραμμής εντολών μεταβιβάστηκαν στην εντολή, έτσι ώστε να μπορούμε να ενεργήσουμε σύμφωνα με το ίδιο:
μετρώ=$ #αν [ ! $ καταμέτρηση -gt 1 ]
τότε
πέταξε έξω «Δεν υπάρχουν αρκετά επιχειρήματα»
αλλού
πέταξε έξω 'Καλή δουλειά!'
είναι
Ας τρέξουμε τώρα αυτό το σενάριο, θα δούμε την ακόλουθη έξοδο:
Αν-Στη συνέχεια-Elif-Else Δηλώσεις
Μπορούμε επίσης να έχουμε πολλαπλές προτάσεις IF στο ίδιο μπλοκ για να περιορίσουμε τη διαδρομή απόφασης που παίρνει το πρόγραμμά μας για την εκτέλεση εντολών που ορίσαμε. Ακολουθεί η σύνταξη για τον ορισμό πολλαπλών προτάσεων IF στα σενάρια μας:
ανΔΟΚΙΜΗ-ΕΝΤΟΛΕΣ?τότε
ΑΠΟΤΕΛΕΣΜΑΤΑ-ΕΝΤΟΛΕΣ?
elif
ΑΛΛΕΣ-ΕΝΤΟΛΕΣ?
τότε
ΑΛΛΑ-ΑΠΟΤΕΛΕΣΜΑΤΑ-ΕΝΤΟΛΕΣ?
αλλού
ΕΝΑΛΛΑΚΤΙΚΕΣ-ΕΝΤΟΛΕΣ?
είναι
Αυτό φαίνεται αρκετά οικείο και εύκολο να το παρακολουθήσετε επίσης. Ας ορίσουμε ένα απλό παράδειγμα για να καθορίσουμε πώς λειτουργεί το δέντρο:
μετρώ=$ #αν [ $ καταμέτρηση -ισοδύναμο 1 ]
τότε
πέταξε έξω 'Βρέθηκε μόνο ένα επιχείρημα.'
elif [ $ καταμέτρηση -ισοδύναμο 2 ]
τότε
πέταξε έξω «Καλύτερα, βρέθηκαν δύο επιχειρήματα».
αλλού
πέταξε έξω 'Καλή δουλειά, βρέθηκαν πολλά επιχειρήματα!'
είναι
Εδώ είναι αυτό που παίρνουμε πίσω με αυτήν την εντολή:
Χρήση υποθέσεων υπόθεσης
Οι δηλώσεις IF-ELSE είναι χρήσιμες όταν έχετε μια μεγάλη λίστα επιλογών για τις οποίες πρέπει να αποφασίσετε. Αλλά σε περίπτωση που θέλετε να εκτελέσετε μια ενέργεια μόνο σε λίγες περιπτώσεις ακριβούς αντιστοίχισης με το αποτέλεσμα, μπορούμε να χρησιμοποιήσουμε προτάσεις CASE και σε δέσμες ενεργειών Bash. Η σύνταξή του μοιάζει με:
υπόθεσηΕΚΦΡΑΣΗσεΥΠΟΘΕΣΗ 1)ΕΝΤΟΛΕΣ ΓΙΑ ΕΚΤΕΛΕΣΗ?ΥΠΟΘΕΣΗ 2)ΕΝΤΟΛΕΣ ΓΙΑ ΕΚΤΕΛΕΣΗ?
ΥΠΟΘΕΣΗ 2)ΕΝΤΟΛΕΣ ΓΙΑ ΕΚΤΕΛΕΣΗ?
...)ΕΝΤΟΛΕΣ ΓΙΑ ΕΚΤΕΛΕΣΗ?
*)ΕΝΤΟΛΕΣ ΓΙΑ ΕΚΤΕΛΕΣΗ?
esac
Η τελευταία περίπτωση με * λειτουργεί ως προεπιλεγμένη περίπτωση και θα εκτελεστεί όταν καμία από τις παραπάνω καθορισμένες περιπτώσεις δεν διαπιστώνεται ότι ταιριάζει.
Ας δημιουργήσουμε γρήγορα ένα απλό παράδειγμα χρησιμοποιώντας τις προτάσεις CASE:
υπόθεση '$ 1' σε1)
πέταξε έξω 'Η τιμή είναι 1.'
;;
2)
πέταξε έξω 'Η τιμή είναι 2.'
;;
3)
πέταξε έξω 'Η τιμή είναι 3.'
;;
*)
πέταξε έξω 'Άλλη τιμή πέρασε.'
esac
Κάθε δήλωση CASE τερματίζεται από; (διπλά σημάδια ημι-κόλου). Εδώ είναι αυτό που παίρνουμε πίσω με αυτήν την εντολή:
συμπέρασμα
Σε αυτό το μάθημα, εξετάσαμε πώς μπορούμε να χρησιμοποιήσουμε τις δηλώσεις IF-ELSE, IF-THEN-ELIF και CASE στα σενάρια Bash που ορίζουμε για να πραγματοποιήσουμε συγκεκριμένες ενέργειες με βάση τις τιμές που υπάρχουν στα προγράμματά μας ή που μεταβιβάζονται από τον χρήστη χρησιμοποιώντας τη θέση Παράμετροι.